示例应用程序中绘制方块的问题

时间:2011-07-10 15:03:53

标签: iphone ios core-graphics quartz-2d

您好我正在制作一个示例应用,其中我想创建一个方块,我使用以下代码

- (void)viewDidLoad {
    [super viewDidLoad];
    [self drawRect:CGRectMake(0, 0, 300, 200)];
    [[self view] setNeedsDisplay];
}
- (void) drawRect:(CGRect)rect
{
    NSLog(@"drawRect");

    CGFloat centerx = rect.size.width/2;
    CGFloat centery = rect.size.height/2;
    CGFloat half = 100/2;
    CGRect theRect = CGRectMake(-half, -half, 100, 100);

    // Grab the drawing context
    CGContextRef context = UIGraphicsGetCurrentContext();

    // like Processing pushMatrix
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, centerx, centery);

    // Uncomment to see the rotated square
    //CGContextRotateCTM(context, rotation);

    // Set red stroke
    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);

    {
        CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1.0);
    }
    // Draw a rect with a red stroke
    CGContextFillRect(context, theRect);
    CGContextStrokeRect(context, theRect);

    // like Processing popMatrix
    CGContextRestoreGState(context);
    [[self view] setNeedsDisplay];

}

但屏幕上没有任何内容,不知道问题是什么。当我调试它时,CGContextRef上下文总是0x0,我不知道为什么它的0x0总是在我的代码中丢失了一些东西。

2 个答案:

答案 0 :(得分:4)

看起来你正在尝试绘制UIViewController的子类。您需要子类UIView来覆盖drawRect:方法,然后使用有效的图形上下文自动调用该方法。你自己几乎从不称呼这种方法。

答案 1 :(得分:1)

引用Apple文档:

“要在iOS应用程序中绘制到屏幕,您需要设置一个UIView对象并实现其drawRect:方法来执行绘图。当视图在屏幕上可见并且其内容需要更新时,将调用视图的drawRect:方法。调用自定义drawRect:方法,视图对象自动配置其绘图环境,以便您的代码可以立即开始绘制。作为此配置的一部分,UIView对象为当前绘图环境创建图形上下文(CGContextRef opaque类型)。通过调用UIKit函数UIGraphicsGetCurrentContext在drawRect:方法中获取此图形上下文。“

因此,您的代码正在按计划进行,您只需要将其放在正确的位置即可。它需要位于View对象中。