如何设置CGContextRef属性而不是使用UIGraphicsGetCurrentContext()

时间:2012-03-04 04:28:42

标签: objective-c xcode core-graphics

我一直在尝试使用UIGraphicsGetCurrentContext和CGContextRef。有人告诉我,使用UIGraphicsGetCurrentContext()很多次都很糟糕,宁愿使用CGContextRef并引用它。

我一直在努力研究第二部分,我遇到了设置@property并引用它的问题。有人可以给我一个声明和用法示例吗?尝试谷歌搜索,找不到任何引用。

TA

1 个答案:

答案 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的局部变量中。