我已经将UIView子类化,并且我实现了drawRect。我基本上希望在设置CGPoint之后调用这个drawRect,这是这个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
为什么会这样?
答案 0 :(得分:4)
您永远不应该直接致电-drawRect:
。
改为使用-setNeedsDisplay
:
self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40);
[self.page_ setNeedsDisplay];
如果您需要自定义绘图区域(又称CGRect
将传递给-drawRect:
),您可以使用-setNeedsDisplayInRect:
正如@rob mayoff建议的那样,您可以覆盖point_
属性的setter:
- (void)setPoint_:(CGPoint)point {
if(!CGPointEqualToPoint(point_, point)) {
point_ = point;
[self setNeedsDisplay];
}
}
答案 1 :(得分:2)
- (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.
答案 2 :(得分:0)
将您的绘图代码包装进去
UIGraphicsPushContext( context )
和UIGraphicsPopContext()
以避免此错误消息。