2010-03-05 115 views
2

这段代码有什么问题?UIView圆角问题

-(void) drawRect:(CGRect) rect { 
     CGContextRef c = UIGraphicsGetCurrentContext(); 
     if (c != nil) { 
      CGContextSetFillColorWithColor(c, self.cornerColor.CGColor); 
      [self drawRoundedCornersInRect:self.bounds inContext:c]; 
      CGContextFillPath(c); 
     } 
    } 

    -(void) drawCornerInContext:(CGContextRef)c cornerX:(int) x cornerY:(int) y 
      arcEndX:(int) endX arcEndY:(int) endY { 
     CGContextMoveToPoint(c, x, endY); 
     CGContextAddArcToPoint(c, x, y, endX, y, radius); 
     CGContextAddLineToPoint(c, x, y); 
     CGContextAddLineToPoint(c, x, endY); 
    } 

    -(void) drawRoundedCornersInRect:(CGRect) rect inContext:(CGContextRef) c { 
    int x_left = rect.origin.x; 
    int x_left_center = rect.origin.x + radius; 
    int x_right_center = rect.origin.x + rect.size.width - radius; 
    int x_right = rect.origin.x + rect.size.width; 
    int y_top = rect.origin.y; 
    int y_top_center = rect.origin.y + radius; 
    int y_bottom_center = rect.origin.y + rect.size.height - radius; 
    int y_bottom = rect.origin.y + rect.size.height; 

     if (roundUpperLeft) { 
      [self drawCornerInContext:c cornerX: x_left cornerY: y_top 
        arcEndX: x_left_center arcEndY: y_top_center]; 
     } 

     if (roundUpperRight) { 
      [self drawCornerInContext:c cornerX: x_right cornerY: y_top 
        arcEndX: x_right_center arcEndY: y_top_center]; 
     } 

     if (roundLowerRight) { 
      [self drawCornerInContext:c cornerX: x_right cornerY: y_bottom 
        arcEndX: x_right_center arcEndY: y_bottom_center]; 
     } 

     if (roundLowerLeft) { 
      [self drawCornerInContext:c cornerX: x_left cornerY: y_bottom 
        arcEndX: x_left_center arcEndY: y_bottom_center]; 
     } 
    } 

没有错误,没有警告......但圆角根本不起作用。我发现这个代码here

回答

4

您需要开始一个路径,并在完成后关闭它。你想第二次打电话给CGContextAddLineToPoint会让我想起来。这是一个可以工作的片段。研究它,并加强它以支持你的多个案例(似乎你只能够圆化一些角落,而不一定全部都是......)

void addRoundedRect(CGContextRef ctx, CGRect rect, float cornerRadius) { 
    if (cornerRadius <= 2.0) { 
     CGContextAddRect(ctx, rect); 
    } else { 
     float x_left = rect.origin.x; 
     float x_left_center = x_left + cornerRadius; 
     float x_right_center = x_left + rect.size.width - cornerRadius; 
     float x_right = x_left + rect.size.width; 
     float y_top = rect.origin.y; 
     float y_top_center = y_top + cornerRadius; 
     float y_bottom_center = y_top + rect.size.height - cornerRadius; 
     float y_bottom = y_top + rect.size.height; 
     /* Begin path */ 
     CGContextBeginPath(ctx); 
     CGContextMoveToPoint(ctx, x_left, y_top_center); 
     /* First corner */ 
     CGContextAddArcToPoint(ctx, x_left, y_top, x_left_center, y_top, cornerRadius); 
     CGContextAddLineToPoint(ctx, x_right_center, y_top); 
     /* Second corner */ 
     CGContextAddArcToPoint(ctx, x_right, y_top, x_right, y_top_center, cornerRadius); 
     CGContextAddLineToPoint(ctx, x_right, y_bottom_center); 
     /* Third corner */ 
     CGContextAddArcToPoint(ctx, x_right, y_bottom, x_right_center, y_bottom, cornerRadius); 
     CGContextAddLineToPoint(ctx, x_left_center, y_bottom); 
     /* Fourth corner */ 
     CGContextAddArcToPoint(ctx, x_left, y_bottom, x_left, y_bottom_center, cornerRadius); 
     CGContextAddLineToPoint(ctx, x_left, y_top_center); 
     /* Done */ 
     CGContextClosePath(ctx); 
    } 
} 
+0

感谢您分享此内容! :) – looneygrc 2010-03-05 08:24:54

+0

这是太大了,我们可以只使用UILayer角落半径属性 在此链接中提到 http://cocoabugs.blogspot.com/2010/08/add-rounded-corners-and-border-to.html – 2010-08-23 12:00:28

2

我使用这个:[view.layer setCornerRadius:7];。它使用UIView的支持者设置拐角半径。

+0

我不清楚我想。我想指定哪个角将被舍入。 CALayer cornerRadius我无法做到这一点。 – looneygrc 2010-03-05 07:06:44

+0

设置角落半径和边框以查看示例 http://cocoabugs.blogspot.com/2010/08/add-rounded-corners-and-border-to.html – 2010-08-23 11:58:49