在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()
以避免出现此错误消息。