2012-03-04 10 views
0

私はUIGraphicsGetCurrentContextとCGContextRefで作業しようとしています。 UIGraphicsGetCurrentContext()を何度も使用するのは悪く、むしろCGContextRefを使用してそれを参照するように言われました。UIGraphicsGetCurrentContext()を使用するのではなく、CGContextRefプロパティを設定するには

私は2番目の部分で作業しようとしていましたが、@propertyを設定して参照する際に問題が発生しています。誰かが私にこの宣言とその使用例を教えてもらえますか? googleを試して、それへの参照を見つけることができませんでした。

Taが

答えて

3

おそらくプロパティにUIGraphicsGetCurrentContextからの戻り値を保存しないでください。通常は、コンテキストがどれくらい長く有効か、コンテキストの寿命が短いかはわかりません。たとえば、drawRect:メソッドからUIGraphicsGetCurrentContextを呼び出す場合、drawRect:から返された後にそのコンテキストが存続する期間はわかりません。 に電話した後にUIGraphicsBeginImageContextWithOptionsに電話している場合は、とにかくすぐにUIGraphicsEndImageContextと電話しているはずです。それらの文脈への言及を念頭に置くことは不適切です。

同じコンテキストで多くのCore Graphics関数を呼び出している場合は、コンテキストをローカル変数に格納します。たとえば、ここに私のテストプロジェクトの1からdrawRect:方法は次のとおりです。

- (void)drawRect:(CGRect)dirtyRect { 
    NSLog(@"drawRect:%@", NSStringFromCGRect(dirtyRect)); 
    [self layoutColumnsIfNeeded]; 
    CGContextRef gc = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(gc); { 
     // Flip the Y-axis of the context because that's what CoreText assumes. 
     CGContextTranslateCTM(gc, 0, self.bounds.size.height); 
     CGContextScaleCTM(gc, 1, -1); 
     for (NSUInteger i = 0, l = CFArrayGetCount(_columnFrames); i < l; ++i) { 
      CTFrameRef frame = CFArrayGetValueAtIndex(_columnFrames, i); 
      CGPathRef path = CTFrameGetPath(frame); 
      CGRect frameRect = CGPathGetBoundingBox(path); 
      if (!CGRectIntersectsRect(frameRect, dirtyRect)) 
       continue; 

      CTFrameDraw(frame, gc); 
     } 
    } CGContextRestoreGState(gc); 
} 

あなたは、私がコンテキストに原料の束をやっていることがわかります。私は節約とグラフィックスの状態を復元するよ、私は」 CTMを変更すると、いくつかのCore Textフレームが描画されます。 UIGraphicsGetCurrentContextを何度も呼び出す代わりに、私はそれをただ一度呼び出して、gcという名前のローカル変数に結果を保存します。

+0

これは基本的にお勧めの方法です。特にコンテキストを動的に常に取得することです。 – Doz