0

我听说很多人不使用 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))];
}

这是我的第一个问题,我不确定我应该在这里放多少信息代码,所以请放轻松。

4

2 回答 2

1

冒着陈述显而易见的风险,看起来你在createLine没有有效上下文的时候打电话。这就是为什么drawRect直接调用不是一个好主意的原因。Intsad,在合适的时间调用setNeedsDisplay并让系统调用。drawRect

于 2010-06-08T17:52:13.793 回答
0

正如walkytalky 所写,您不应该drawRect直接打电话。如果您需要确保drawRect触发调用,然后调用setNeedsDisplay,这将确保drawRect在适当的时间调用。

你方法的最后一行createLine::有点令人困惑和不正统。我认为出于您的目的,您想删除该行并简单地将其替换为 all to setNeedsDisplay。这应该会触发drawRect对新 lineStart 和 lineEnd 值的调用。

于 2015-06-06T21:09:28.203 回答