>  Q&A  >  본문

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中文网2728일 전364

모든 응답(1)나는 대답할 것이다

  • 阿神

    阿神2017-05-02 09:24:19

    공식 문서:

    뷰의 형상만 변경하면 일반적으로 뷰는
    다시 생성되지 않습니다.

    drawRect의 호출 시점은 시스템에 의해 결정됩니다(처음 표시될 때 등). 이는 시스템에서 drawRect를 호출하지 않는 경우도 있음을 의미합니다.
    다음 다시 그리기 주기에서 뷰를 업데이트하기 위해 drawRect를 강제로 호출하려면 다음 메서드를 사용하세요

    • setNeedsDisplay

    회신하다
    0
  • 취소회신하다