搜尋

首頁  >  問答  >  主體

objective-c - cocoa-不知道drawRect:為什麼呼叫?

在學習別人的程式碼,準備寫一個狀態列應用程式。
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中文网2758 天前393

全部回覆(1)我來回復

  • 阿神

    阿神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

    回覆
    0
  • 取消回覆