2009-04-14 34 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

繪製圖像前添加圓角矩形路徑剪切路徑。

+0

謝謝!所以,CGContextClip似乎清除了當前的繪圖路徑。這是否意味着我需要兩次追蹤相同的路徑?一次剪輯,然後一次繪製?另外,我必須在剪切前保存上下文的狀態,並在繪製圖像後將其恢復,對嗎?否則我的路徑跨越剪輯。 – 2009-04-14 17:09:14