2012-02-27 20 views
6

NSViewのCGContextを-drawRect:から取得して後で描画を実行するのは安全ですか?このような簡単なテストでは:NSViewの描画コンテキスト

CGContextRef context = NULL; 

- (void)drawRect:(NSRect)r 
{ 
    if (!context) 
     context = [[NSGraphicsContext currentContext] graphicsPort]; 
} 

- (void)drawSomething 
{ 
    CGContextSetRGBFillColor(context, 1, 0, 0, 1); 
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100)); 
    CGContextFlush(context); 
} 

すべてが-drawSomethingが呼び出されたときに動作するようですが、それはコンテキストが変更されないことを保証しているのですか?

わかりましたように、私は-drawRect:を使用して標準的な描画方法を回避しようとしています。無限の場面でうまく動作しますが、より手続き的な描画方法は、私の特定のケースでは人生を楽にします。

答えて

6

これは行わないでください。文脈はdrawRect:の外に存在することが保証されておらず、あなたの作図コードが機能しているという事実は幸運な事故です。この動作に頼らないでください。

いつでも描画を強制する必要がある場合は、ビューのdisplayに電話をかけてください(drawRect:)。あなたはここで外drawRect: 描きたい場合はlockFocus:を使用する必要が

2

NSViewの文書からの抜粋です:

ディスプレイを使用しない場合は... NSViewのオブジェクトを描画する方法、 は、ウィンドウサーバー にコマンドを送信するメソッドを呼び出す前にlockFocusを呼び出す必要があり、終了したらunlockFocusメッセージ とのバランスをとる必要があります。

ワンショットウィンドウを非表示または縮小すると、そのウィンドウが解放される のバッキングストアが発生します。描画する標準ディスプレイ のメカニズムを使用しない場合は、ウィンドウが のいずれかが縮小または非表示になっている間に描画する可能性がある場合は、 lockFocusではなくlockFocusIfCanDrawを使用する必要があります。

関連する問題