我听说很多人因不使用drawRect而导致上下文错误
现在我有了这个:
- (void)drawRect:(CGRect)rect {
NSLog(@"drawRect: Starts");
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextSetLineWidth(context, 3.0);
CGContextMoveToPoint(context, lineStart.x, lineStart.y);
CGContextAddLineToPoint(context, lineEnd.x, lineEnd.y);
CGContextStrokePath(context);
}
错误:
<Error>: CGContextSetRGBStrokeColor: invalid context
哪个曾在以前的程序中工作过,但在这个程序上却没有。有什么不同:我有一个视图控制器,它调用这个UIView:
-(void)createLine:(CGPoint)start:(CGPoint)end {
NSLog(@"createLine: Starts");
lineEnd = start;
lineStart = end;
self = [super initWithFrame:drawRect:CGRectMake(fmin(lineStart.x, lineEnd.x), fmin(lineStart.y, lineEnd.y), fabs(lineStart.x - lineEnd.x), fabs(lineStart.y - lineEnd.y))];
}
这是我的第一个问题,我不知道我应该把多少信息代码放在这里,所以对我来说很容易。
答案 0 :(得分:1)
冒着明显的风险,当你没有有效的上下文时,看起来你正在调用createLine
。这就是直接调用drawRect
不是一个好主意的原因。 Intsead,请致电setNeedsDisplay
并让系统在合适的时间拨打drawRect
。
答案 1 :(得分:0)
正如walkytalky所写,你不应该直接打电话给drawRect
。如果您需要确保触发对drawRect
的调用,请拨打setNeedsDisplay
,这将确保在适当的时间调用drawRect
。
createLine::
方法的最后一行有点令人困惑和非正统。我认为,为了您的目的,您要删除该行,只需将其替换为setNeedsDisplay
的全部。这应该触发使用新的lineStart和lineEnd值调用drawRect
。