2010-03-05 3 views
2

Что не так с этим кодом?UIView rounded corners Вопрос

-(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

+0

это слишком большое, мы можем использовать только свойство UILayer corner-radius , как указано в этой ссылке http://cocoabugs.blogspot.com/2010/08/add-rounded-corners-and-border-to.html – 2010-08-23 12:00:28

2

Я пользуюсь этим: [view.layer setCornerRadius:7];. Он устанавливает радиус угла, используя UIViewCALayer.

+0

Я не был чист, я полагаю. Я хочу указать, какой из углов будет округлен. С CALayer cornerRadius я не могу этого сделать. – looneygrc

+0

установка радиуса угла и границы для просмотра образца http://cocoabugs.blogspot.com/2010/08/add-rounded-corners-and-border-to.html – 2010-08-23 11:58:49