Objective-C肋骨绘图与绘图:(CGContextRef*)上下文

Objective-C肋骨绘图与绘图:(CGContextRef*)上下文,objective-c,cocoa-touch,Objective C,Cocoa Touch,我有一个家庭作业,我们的教授告诉我们让圆、正方形和三角形符合一个叫做 Shape.h: #import <Foundation/Foundation.h> @protocol Shape <NSObject> @required - (void)draw:(CGContextRef) context; - (float)area; @end @interface MyRect : UIView <Shape> 其中myView是我拖到.xib上的UI

我有一个家庭作业,我们的教授告诉我们让圆、正方形和三角形符合一个叫做

Shape.h

#import <Foundation/Foundation.h>

@protocol Shape <NSObject>

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

@end
@interface MyRect : UIView <Shape>
其中
myView
是我拖到
.xib上的
UIView

并在
MyRect
类中执行绘制

MyRect.h

#import <Foundation/Foundation.h>

@protocol Shape <NSObject>

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

@end
@interface MyRect : UIView <Shape>
但后来我发现了一个错误:

[...] <Error>: CGContextSetFillColorWithColor: invalid context 0x0
[...] <Error>: CGContextAddRect: invalid context 0x0
[...] <Error>: CGContextFillRects: invalid context 0x0
[…]:CGContextSetFillColorWithColor:无效上下文0x0
[…]:CGContextAddRect:无效的上下文0x0
[…]:CGContextFillRects:无效的上下文0x0
我猜它来自
[rectView-draw:UIGraphicsGetCurrentContext()]

你知道怎么解决这个问题吗


谢谢

UIGraphicsGetCurrentContext()将返回nil,drawRect中除外:。UIKit将在drawRect之前创建上下文:

也可以创建自己的上下文进行绘制

UIKit示例:

UIGraphicsBeginImageContext() 
UIGraphicsGetImageFromCurrentImageContext() to get image context
UIGraphicsEndImageContext()
核心图形示例:

CGBitmapContextCreate()
文件:


UIGraphicsGetCurrentContext()将返回nil,drawRect中除外:。UIKit将在drawRect之前创建上下文:

也可以创建自己的上下文进行绘制

UIKit示例:

UIGraphicsBeginImageContext() 
UIGraphicsGetImageFromCurrentImageContext() to get image context
UIGraphicsEndImageContext()
核心图形示例:

CGBitmapContextCreate()
文件:


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

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

您应该使用
-drawRect:
并在UIView子类中生成所有图形。您可以而不是从您想要的位置获取上下文。仅在命名的方法中。

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

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

您应该使用
-drawRect:
并在UIView子类中生成所有图形。您可以而不是从您想要的位置获取上下文。仅在指定的方法中。

谢谢,但不确定我们的教授是否故意这么做(他经常出错…),他要求我们改写
-(void)draw:(CGContextRef)context
如果丢弃我的代码,您认为您能做些什么来解决这个问题?UIKit中没有
-draw:
方法。您可以使用CALayer委托并覆盖CALayers
-drawInContext:
方法,但只有当您想为rect设置动画时才需要此方法。要解决此问题,您只需将上面的代码放入命名的
-drawinRect:
方法中即可。它将被自动调用,您不必调用“[rectView drawRect:]或其他什么。不需要更多的魔法;)我已经测试过了,它很有效。。但我不认为我会得到分数,因为他要求我们使用委托来确认
Shape.h
并绘制矩形等等。。由于
draw:
是一项要求,我假设他希望我们使用该方法来绘制……我不太确定这如何工作,因为视图上下文仅在该方法中可用。你可以很容易地使用BOOL来确认它是否应该绘制。在自定义的
-draw
方法中,执行以下操作:
shouldDraw=YES;[自我设置需要显示];shouldDraw=否这将迫使您重新绘制视图。谢谢,但不确定我们的教授是否故意这样做(他经常出错…),他要求我们覆盖
-(void)draw:(CGContextRef)context
如果丢弃我的代码,您认为您能做些什么来解决这个问题?UIKit中没有
-draw:
方法。您可以使用CALayer委托并覆盖CALayers
-drawInContext:
方法,但只有当您想为rect设置动画时才需要此方法。要解决此问题,您只需将上面的代码放入命名的
-drawinRect:
方法中即可。它将被自动调用,您不必调用“[rectView drawRect:]或其他什么。不需要更多的魔法;)我已经测试过了,它很有效。。但我不认为我会得到分数,因为他要求我们使用委托来确认
Shape.h
并绘制矩形等等。。由于
draw:
是一项要求,我假设他希望我们使用该方法来绘制……我不太确定这如何工作,因为视图上下文仅在该方法中可用。你可以很容易地使用BOOL来确认它是否应该绘制。在自定义的
-draw
方法中,执行以下操作:
shouldDraw=YES;[自我设置需要显示];shouldDraw=否这将迫使您的视图重新绘制。感谢您的快速回复!我正在阅读文档和措辞,如果我希望它是
UIView
的大小(myView),我如何获得
CGSize
?感谢您的快速回复!我正在阅读文档和措辞,如果我希望它是
UIView
的大小(myView),我如何获得
CGSize