2009-04-14 6 views
3

カスタムビューを実装しようとしています。このビューには、灰色の丸い矩形の枠で囲まれたイメージが表示されます。境界が丸くなっているので、境界線だけでなく、細かい部分も表示することができますが、これらの角をクリアする方法が必要です。どうすればこれを達成できますか?iPhone SDKを使用して四角形の四角形の外側の角をクリアするにはどうすればよいですか?

CGContextClearRectを使用することができるようですが、これを複数回呼び出す必要はありません。丸い角の外側の領域を再構築する必要はありませんか?それは過度に複雑に聞こえる。

このビューを作成するより良い方法はありますか?

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Draw the image. This will completely fill the current rect. 
    [image drawInRect:self.bounds]; 

    // Ensure we draw completely within our bounds instead of straddling it. 
    CGRect rrect = self.bounds; 
    rrect.size.height = rrect.size.height - 1.0; 
    rrect.size.width = rrect.size.width - 1.0; 
    rrect.origin.x = rrect.origin.x + (1.0/2); 
    rrect.origin.y = rrect.origin.y + (1.0/2); 

    CGFloat radius = 5.0; 
    CGFloat minx = CGRectGetMinX(rrect); 
    CGFloat midx = CGRectGetMidX(rrect); 
    CGFloat maxx = CGRectGetMaxX(rrect); 
    CGFloat miny = CGRectGetMinY(rrect); 
    CGFloat midy = CGRectGetMidY(rrect); 
    CGFloat maxy = CGRectGetMaxY(rrect); 

    // Draw the rounded rect border. 
    CGContextSetRGBStrokeColor(context, 0.6, 0.6, 0.6, 1.0); 
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0); 
    CGContextSetLineWidth(context, 1.0); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
    CGContextDrawPath(context, kCGPathFillStroke); 
} 

答えて

7

は、画像を描画する前にクリッピングパスに丸め-RECTのパスを追加します。

は、ここに私の現在のコードです。

+0

ありがとう!したがって、CGContextClipは現在の描画パスをクリアしているようです。同じパスを2回トレースする必要があるのでしょうか?一度クリップしてから一度描きますか?また、クリッピングする前にコンテキストの状態を保存し、イメージを描画した後に復元する必要があります。そうでなければ、私の道がクリップにまたがります。 –

+0

パスを入力するかストロークする場合は、現在のパスにパスが必要です。画像を描画することは、現在のパスとは関係ありません。クリッピングパスのみがそれに影響します。そして、もしあなたがアンクリッピングした後に引き出したいなら、あなたは前にgsaveしてからgrestoreする必要があります。 –

+0

しかし、CGContextClipを呼び出すときにクリップにクリップする場合は、現在のパスにパスが必要です。だから私はコンテキストにパスを2回追加する必要があります。 CGContextClipの直前に一度、ストロークする前に一度。ちょっとしたことを忘れていないことを確認してください。 –

関連する問題