我有一份家庭作业,我们的教授告诉我们做圆形,方形和三角形确认一个名为
的协议 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];
}
其中myView
是UIView
我拖到.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()];
如何解决这个问题?
谢谢!
答案 0 :(得分:1)
除了drawRect:之外,UIGraphicsGetCurrentContext()将返回nil。 UIKit将在drawRect:。
之前创建上下文您也可以创建自己的上下文来绘制。
UIKit示例:
UIGraphicsBeginImageContext()
UIGraphicsGetImageFromCurrentImageContext() to get image context
UIGraphicsEndImageContext()
核心图形示例:
CGBitmapContextCreate()
文件:
答案 1 :(得分:0)
首先,您将覆盖MyRect类中的-drawRect:
方法。
然后使用
[[UIColor greenColor] set] // or setStroke, 'cause your using stroke and not fill!
CGContextStrokeRect(UIGraphicsGetCurrentContext(), rect)
您应该使用-drawRect:
并在UIView子类中进行所有绘制。您可以不从您想要的位置获取上下文。仅在命名方法中。