使用draw:(CGContextRef *)上下文绘制Objective-C costum

时间:2013-04-18 08:27:15

标签: objective-c cocoa-touch

我有一份家庭作业,我们的教授告诉我们做圆形,方形和三角形确认一个名为

的协议

Shape.h

#import <Foundation/Foundation.h>

@protocol Shape <NSObject>

@required
- (void)draw:(CGContextRef) context;
- (float)area;

@end

并使用UIBotton调用不同的类来绘制..

我从我的视图控制器调用draw函数

XYZController.m

- (IBAction)rectButton:(id)sender {
    CGRect frame = [myView bounds];

    MyRect *rectView = [[MyRect alloc] initWithFrame:frame];

    [rectView draw: UIGraphicsGetCurrentContext()];
    [myView addSubview:rectView];
}

其中myViewUIView我拖到.xib

并在MyRect

中执行绘制

MyRect.h

@interface MyRect : UIView <Shape>

我将超级类从NSObject改为UIView ......不确定我是否正确地做了..

MyRect.m

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setNeedsDisplay];
    }

    return self;
}

- (void)draw : (CGContextRef) context
{
    CGRect bounds = [self bounds];

    CGRect originRect = CGRectMake(25.0, 25.0, 50.0, 75.0);

    CGContextAddRect(context, originRect);
    CGContextStrokePath(context);
    [[UIColor greenColor] setFill];
    CGContextFillRect(context, originRect);
}

但后来我收到了错误:

[...] <Error>: CGContextSetFillColorWithColor: invalid context 0x0
[...] <Error>: CGContextAddRect: invalid context 0x0
[...] <Error>: CGContextFillRects: invalid context 0x0

我猜这是来自[rectView draw: UIGraphicsGetCurrentContext()];

如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

除了drawRect:之外,UIGraphicsGetCurrentContext()将返回nil。 UIKit将在drawRect:。

之前创建上下文

您也可以创建自己的上下文来绘制。

UIKit示例:

UIGraphicsBeginImageContext() 
UIGraphicsGetImageFromCurrentImageContext() to get image context
UIGraphicsEndImageContext()

核心图形示例:

CGBitmapContextCreate()

文件:

UIKit Function Reference

CGBitmapContext Reference

答案 1 :(得分:0)

首先,您将覆盖MyRect类中的-drawRect:方法。 然后使用

[[UIColor greenColor] set] // or setStroke, 'cause your using stroke and not fill!
CGContextStrokeRect(UIGraphicsGetCurrentContext(), rect)

您应该使用-drawRect:并在UIView子类中进行所有绘制。您可以从您想要的位置获取上下文。仅在命名方法中。