おそらくプロパティに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
という名前のローカル変数に結果を保存します。
これは基本的にお勧めの方法です。特にコンテキストを動的に常に取得することです。 – Doz