在iPhone中画一条线,例外

时间:2010-08-21 05:21:53

标签: iphone exception quartz-graphics cgcontext

我想画一条线。

我写了如下代码。

UIColor *currentColor = [UIColor blackColor];

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGContextMoveToPoint(context, startingPoint.x, startingPoint.y);
CGContextAddLineToPoint(context,endingPoint.x , endingPoint.y);
CGContextStrokePath(context);

但是这显示如下例外

Sat Aug 21 10:47:20 AAA-rrr-Mac-mini.local Test[2147] <Error>: CGContextSetLineWidth: invalid context 0x0
Sat Aug 21 10:47:20 AAA-rrr-Mac-mini.local Test[2147] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0
Sat Aug 21 10:47:20 AAA-rrr-Mac-mini.local Test[2147] <Error>: CGContextMoveToPoint: invalid context 0x0
Sat Aug 21 10:47:20 AAA-rrr-Mac-mini.local Test[2147] <Error>: CGContextAddLineToPoint: invalid context 0x0
Sat Aug 21 10:47:20 AAA-rrr-Mac-mini.local Test[2147] <Error>: CGContextDrawPath: invalid context 0x0

2 个答案:

答案 0 :(得分:4)

您还需要在致电CGContextBeginPath(ctx);

之前致电CGContextMoveToPoint
- (void) drawRect: (CGRect) rect
{
  UIColor *currentColor = [UIColor blackColor];

  CGContextRef context = UIGraphicsGetCurrentContext(); 
  CGContextSetLineWidth(context, 2.0);
  CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
  CGContextBeginPath(context); // <---- this 
  CGContextMoveToPoint(context, self.bounds.origin.x, self.bounds.origin.y);
  CGContextAddLineToPoint(context, self.bounds.origin.x + self.bounds.size.x, self.bounds.origin.y + self.bounds.size.y);
  CGContextStrokePath(context);
}

答案 1 :(得分:2)

您没有有效的图形上下文。 UIGraphicsGetCurrentContext()显然已返回nil

你想在哪里画画?

如果你想绘制到屏幕,那么你应该实现drawRect:或其子类之一的UIView方法并让iOS调用该方法(通过触发刷新部分屏幕) )。然后,在执行drawRect:期间,您将获得有效的图形上下文。

如果要绘制到屏幕外像素图,则必须使用UIGraphicsBeginImageContext或类似函数自行创建图形上下文。

修改

因此,要绘制到 UIView ,您需要创建一个 UIView 子类并覆盖 drawRect:

@interfaceMyView : UIView {
}

@end


@implementation MyUIView

- (void) drawRect: (CGRect) rect
{
  UIColor *currentColor = [UIColor blackColor];

  CGContextRef context = UIGraphicsGetCurrentContext(); 
  CGContextSetLineWidth(context, 2.0);
  CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
  CGContextMoveToPoint(context, self.bounds.origin.x, self.bounds.origin.y);
  CGContextAddLineToPoint(context, self.bounds.origin.x + self.bounds.size.x, self.bounds.origin.y + self.bounds.size.y);
  CGContextStrokePath(context);
}

然后打开XIB文件(您可能已在Interface Builder中添加=,在那里添加 UIView 并选择MyUIView作为类(Inspector窗口中最后一个选项卡上的第一个字段)。