在學習別人的程式碼,準備寫一個狀態列應用程式。
在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
賦值時調用的。不知道為什麼?
阿神2017-05-02 09:24:19
官方文件中:
If you simply change the geometry of the view, the view is typically
not redrawn.
drawRect的呼叫時機是由系統決定的(第一次顯示時等),也就是說某些情況drawRect 不會被系統呼叫。
使用下面的方法,可以強制在下一個重繪週期,呼叫drawRect 更新視圖
setNeedsDisplay