在学习别人的代码,准备写一个状态栏应用。
在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 更新视图