objective-c - cocoa-不知道drawRect:为什么调用?

浏览:60日期:2023-12-03

问题描述

在学习别人的代码,准备写一个状态栏应用。在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赋值时调用的。不知道为什么?

问题解答

回答1:

官方文档中:

If you simply change the geometry of the view, the view is typicallynot redrawn.

drawRect的调用时机是由系统决定的(第一次显示时等),也就是说某些情况drawRect 不会被系统调用。使用下面的方法,可以强制在下一个重绘周期,调用drawRect 更新视图

setNeedsDisplay

相关文章: