0

为什么必须从 drawRect 方法中调用 Quartz 2D 图形上下文函数?

因为如果我从除 drawRect 之外的任何地方调用 CGGraphics 上下文函数,我会收到如下消息:

<Error>: CGContextFillRects: invalid context
<Error>: CGContextSetFillColorWithColor: invalid context

实际上,在 UIView 的一个子类中,我确实在一个名为 Render 的方法中设置了一个图形上下文。打赌当 Render 被调用时,我得到了上述错误:

- (void)Render {
    CGContextRef g = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(g, [UIColor blueColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"It works!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];
    NSLog(@"gsTest Render");
}
4

2 回答 2

3

他们没有。也许你应该详细说明一下。

Cocoa 在调用你的 drawRect 实现之前为你设置了一个上下文。如果你想在其他地方画一些东西,那么设置工作是你的责任。

于 2009-12-17T22:59:49.370 回答
2

UIGraphicsGetCurrentContext 从框架设置的堆栈中检索图形上下文。UIKit 保证当 drawRect 方法被调用时,一个有效的图形上下文已经被推送到这个堆栈上。从它返回后,此堆栈将被弹出。如果您在 drawRect 函数之外调用它,它将无效。

相反,如果你想在 drawRect 之外调用它,你需要创建/获取你自己的图形上下文并在上面绘制。

一些绘图函数,例如 NSString drawAtPoint:withFont: 也使用这个堆栈;如果当前上下文无效,您将需要调用 UIGraphicsPushContext

于 2009-12-18T00:47:23.813 回答