UIView закругленные углы Вопрос - PullRequest
2 голосов
/ 05 марта 2010

Что не так с этим кодом?

-(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];
        }
    }

Без ошибок, без предупреждений ... но закругленные углы вообще не работают. Я нашел этот код здесь .

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Вам нужно начать путь и закрыть его, когда вы закончите.Ваш второй вызов 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);
    }
}
2 голосов
/ 05 марта 2010

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

...