我一直在尝试使用UIGraphicsGetCurrentContext和CGContextRef。有人告诉我,使用UIGraphicsGetCurrentContext()很多次都很糟糕,宁愿使用CGContextRef并引用它。
我一直在努力研究第二部分,我遇到了设置@property并引用它的问题。有人可以给我一个声明和用法示例吗?尝试谷歌搜索,找不到任何引用。
TA
答案 0 :(得分:3)
您可能不应该将UIGraphicsGetCurrentContext
的返回值存储在属性中。您通常要么不知道上下文有效多长时间,要么上下文的生命周期很短。例如,如果您从UIGraphicsGetCurrentContext
方法调用drawRect:
,则在从drawRect:
返回后,您不知道该上下文将存活多长时间。如果您在致电UIGraphicsGetCurrentContext
后致电UIGraphicsBeginImageContextWithOptions
,则无论如何您很可能会尽快致电UIGraphicsEndImageContext
。保持对这些背景的引用是不合适的。
如果要在同一上下文中调用许多Core Graphics函数,则需要将上下文存储在局部变量中。例如,以下是我的一个测试项目中的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
的局部变量中。