objective-c - cocoa-不知道drawRect:為什麼呼叫?
PHP中文网
PHP中文网 2017-05-02 09:22:19
0
1
387

在學習別人的程式碼,準備寫一個狀態列應用程式。
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賦值時調用的。不知道為什麼?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(1)
阿神

官方文件中:

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

drawRect的呼叫時機是由系統決定的(第一次顯示時等),也就是說某些情況drawRect 不會被系統呼叫。
使用下面的方法,可以強制在下一個重繪週期,呼叫drawRect 更新視圖

  • setNeedsDisplay

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板