在学习别人的代码,准备写一个状态栏应用。
在AppDelegate
里出现了这段代码
- (void)setStatusImageAndToolTip:(enum InfoStatus)status {
NSString *name = [nameArray objectAtIndex:status];
NSString *toolTip = [toolTipArray objectAtIndex:status];
NSImage *image = [NSImage imageNamed:name];
CGFloat length = image.size.width / image.size.height * statusBarHeight * 0.8;
[image setSize:NSMakeSize(length, statusBarHeight * 0.8)];
statusView.image = image;
statusView.alternateImage = image;
[statusView.alternateImage setTemplate:YES];
statusItem.length = length; //此处调用drawRect
statusView.toolTip = toolTip;
}
这段代码是在observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
函数里调用的。在当状态变量status
改变后,调用setStatusImageAndToolTip
函数。
由于我自己的项目里并没有用到状态改变,就没有写这部分代码。但是导致了在运行时不执行drawRect:
函数,所以在状态栏没有显示图标。
回头研究代码时,发现drawRect是在statusItem.length
赋值时调用的。不知道为什么?
公式ドキュメント内:
drawRectの呼び出しタイミングはシステムが決める(初回表示時など)ため、場合によってはシステムからdrawRectが呼び出されないこともあります。
次の再描画サイクルでビューを更新するためにdrawRectを強制的に呼び出すには、次のメソッドを使用します