2012-02-23 15 views
0

UIViewをサブクラス化してdrawRectを実装しました。私は基本的に、このUIViewのプロパティであるCGPointを設定した後、このdrawRectを呼び出すようにします。これはどうすればいいですか?UIViewサブクラスでdrawRectを呼び出す

私はこれのUIViewのポイントを設定していると私は私の他のUIViewControllerでのdrawRectを呼び出す好き
-(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); 
    } 
} 

は、次のとおりです:

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 

これはなぜですか?

答えて

4

-drawRect:は絶対に電話しないでください。

使用-setNeedsDisplay代わり:

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

あなたは(-drawRect:に渡されますCGRect別名)描画領域をカスタマイズする必要がある場合@rob mayoffが示唆したように、あなたは、-setNeedsDisplayInRect:

を使用することができますpoint_プロパティの設定ツールを上書きできます。

- (void)setPoint_:(CGPoint)point { 
    if(!CGPointEqualToPoint(point_, point)) { 
     point_ = point; 
     [self setNeedsDisplay]; 
    } 
} 
+1

'point_'の値が実際に変更された場合、' point_'プロパティセッターが 'setNeedsDisplay'を呼び出す方が良いでしょう。 –

+0

aha..thatはいいアイデアです。setteerではsetNeedsDisplayを呼び出します。なぜこれが良いのかを説明する心ですか? – adit

0

UIGraphicsPushContext(context)UIGraphicsPopContext()に図面コードを囲み、このエラーメッセージを回避します。

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. 
関連する問題