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

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート