iphone - UIView圆角问题

标签 iphone 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 .

最佳答案

您需要开始一条路径,并在完成后关闭它。我认为你对 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);
    }
}

关于iphone - UIView圆角问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2385046/

相关文章:

iphone - 从 iPhone 优化页面中删除水平移动/摆动

iphone - 如何从 iPhone 模拟器录制电影?

ios - UIScrollView 框架被自动移动

iphone - 用于 UIView 的 iOS initWithNibName

ios - UIScrollView水平和垂直滚动的策略

iphone - 平滑 Core Graphics 中的圆形笔划

html - 图像在 safari 中打破圆形边框

iphone - 如何在右上角以编程方式创建信息按钮?

iphone - 为什么 iPhone 应用程序更新会破坏我的应用程序?

html - 灵活的圆 Angular 框,带阴影,使用图像