2010-08-28 55 views
0

我看到很多使用iPhone SDK繪製圓角矩形的例子。我真正需要的是一個修整角矩形,東西會看起來如下:如何在iPhone上繪製具有修剪而非圓角的矩形的矩形?

alt text

感謝, 喬希

+0

用什麼庫?你可以使用OpenGL ES或CGGeometry(或者甚至Cocos2d,但你可能不會)。 – 2010-08-28 17:23:37

+0

這並不重要。只是尋找最簡單的解決方案 – Joshua 2010-08-28 19:43:12

回答

5

(這是編輯把喬納森Grynspan的建議,只是使用的輔助函數來創建路徑,它現在還允許修剪邊角的高度是從它的寬度不同。)

這裏是一個幫助ç - 功能創建一個這樣的路徑:

// Note: caller is responsible for releasing the returned path 
CGPathRef createAngledCornerRectPath(CGRect rect, 
            CGSize cornerSize, 
            CGFloat strokeWidth) 
{ 
    CGMutablePathRef p = CGPathCreateMutable(); 

    // Make points for the corners 
    CGFloat inset = strokeWidth/2; // because the stroke is centered on the path. 
    CGPoint tlc = CGPointMake(CGRectGetMinX(rect) + inset, 
           CGRectGetMinY(rect) + inset); 
    CGPoint trc = CGPointMake(CGRectGetMaxX(rect) - inset, 
           CGRectGetMinY(rect) + inset); 
    CGPoint blc = CGPointMake(CGRectGetMinX(rect) + inset, 
           CGRectGetMaxY(rect) - inset); 
    CGPoint brc = CGPointMake(CGRectGetMaxX(rect) - inset, 
           CGRectGetMaxY(rect) - inset); 

    // Start in top left and move around counter-clockwise. 
    CGPathMoveToPoint(p, NULL, tlc.x, tlc.y+cornerSize.height); 
    CGPathAddLineToPoint(p, NULL, blc.x, blc.y-cornerSize.height); 
    CGPathAddLineToPoint(p, NULL, blc.x+cornerSize.width, blc.y); 
    CGPathAddLineToPoint(p, NULL, brc.x-cornerSize.width, brc.y); 
    CGPathAddLineToPoint(p, NULL, brc.x, brc.y-cornerSize.height); 
    CGPathAddLineToPoint(p, NULL, trc.x, trc.y+cornerSize.height); 
    CGPathAddLineToPoint(p, NULL, trc.x-cornerSize.width, trc.y); 
    CGPathAddLineToPoint(p, NULL, tlc.x+cornerSize.width, trc.y); 
    CGPathCloseSubpath(p); 

    return p; 
} 

這裏是你將如何使用這把定製的視圖的-drawRect:方法:

- (void)drawRect:(CGRect)rect 
{ 
    // Define a few parameters 
    CGSize cornerSize = CGSizeMake(30.f, 30.f); 
    CGFloat strokeWidth = 3.f; 
    CGColorRef strokeColor = [UIColor redColor].CGColor; 

    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(c, strokeColor); 
    CGContextSetLineWidth(c, strokeWidth); 

    // Create the path, add it to the context, and stroke it. 
    CGPathRef path = createAngledCornerRectPath(rect, 
               cornerSize, 
               strokeWidth); 
    CGContextAddPath(c, path); 
    CGContextStrokePath(c); 

    // we are responsible for releasing the path 
    CGPathRelease(path); 
} 
+0

這很好,但我將它進一步概括爲一個函數,該函數返回一個'CGPath'對象 - 這樣它就可以用來填充一個形狀,對它進行描邊,剪輯等。 – 2010-08-29 02:29:08

+0

好的建議。我編輯它來做到這一點。 – Kelan 2010-08-29 04:36:19

+0

太棒了,thanx很多! – Joshua 2010-08-29 11:44:13

0

我只想用8條線段(啓動路徑,增加行路,末端路徑,行程路徑)。 您只需在每個x或y角座標上添加或減去一些常量即可獲得全部8個點。您可以使用與CGStrokeRect相同的API編寫一個簡單的函數來封裝所有上述內容。