在UIView子类中调用drawRect

我已经subclassed一个UIView,我有一个drawRect实现。 我基本上想要这个drawRect被调用后,我已经设置了CGPoint,这是这​​个UIView的属性。 我该怎么做呢? 这是我的代码:

-(id) initWithCoder:(NSCoder *)aDecoder { if(self = [super initWithCoder:aDecoder]) { point_.x = 0; self.page_ = [UIImage imageNamed:@"pages"]; } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { if (point_.x != 0){ [self.page_ drawInRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); CGContextSetLineWidth(context, 1.0f); CGContextMoveToPoint(context, 40, point_.y); CGContextAddLineToPoint(context, 420, point_.y); CGContextStrokePath(context); } } 

当我设置这个UIView的点,我在我的其他UIViewController调用drawRect如下所示:

  self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40); [self.page_ drawRect:self.page_.frame]; 

它给了我所有这些错误:

  <Error>: CGContextSaveGState: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextSetBlendMode: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextSetAlpha: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextTranslateCTM: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextScaleCTM: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextDrawImage: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextRestoreGState: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextSetLineWidth: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextMoveToPoint: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextAddLineToPoint: invalid context 0x0 Feb 22 20:24:38 <Error>: CGContextDrawPath: invalid context 0x0 

为什么是这样?

你永远不应该直接调用-drawRect:

改为使用-setNeedsDisplay

 self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40); [self.page_ setNeedsDisplay]; 

如果您需要自定义绘图区域(又名将传递给-drawRect: ),则可以使用-setNeedsDisplayInRect:

正如@rob mayoff所build议的那样,你可以覆盖point_属性的setter:

 - (void)setPoint_:(CGPoint)point { if(!CGPointEqualToPoint(point_, point)) { point_ = point; [self setNeedsDisplay]; } } 
 - (id)initWithCoder:(NSCoder *)aDecoder // (1) { if (self = [super initWithCoder:aDecoder]) { [self setMultipleTouchEnabled:NO]; // (2) [self setBackgroundColor:[UIColor whiteColor]]; path = [UIBezierPath bezierPath]; [path setLineWidth:2.0]; } return self; } - (void) drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0); CGContextSetLineWidth(context, 3.0); CGContextDrawPath(context, kCGPathFillStroke); //CGContextSetRGBFillColor doesn't work either CGContextBeginPath(context); CGContextMoveToPoint(context, 100.0, 60.0); CGRect rectangle = {100.0, 60.0, 120.0, 120.0}; CGContextAddRect(context, rectangle); CGContextStrokePath(context); CGContextFillPath(context); } this code implement in create new uiview and add this code i hope that code you usefull. 

将您的绘图代码包装到UIGraphicsPushContext( context )UIGraphicsPopContext()以避免出现此错误消息。