objective-c - cocoa-不知道drawRect:为什么调用?
PHP中文网
PHP中文网 2017-05-02 09:22:19
0
1
389

在学习别人的代码,准备写一个状态栏应用。
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)
阿神

공식 문서:

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

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

  • setNeedsDisplay

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿