如何以编程方式在 UIview 中制作圆角和边?

Posted

技术标签:

【中文标题】如何以编程方式在 UIview 中制作圆角和边?【英文标题】:How to make rounded corners and sides in UIview programmatically? 【发布时间】:2015-11-21 20:56:08 【问题描述】:

如何在 UIview 中像 youtube 一样以编程方式制作圆角和边:

我知道如何制作圆角,但不知道如何制作圆边。我需要以编程方式进行(不仅仅是设置先前设计的图像蒙版)

【问题讨论】:

对不起,我的意思是圆边(不是边框)。更新主题 【参考方案1】:

您可以创建一个UIBezierPath。如果您只想绕过拐角,可以使用bezierPathWithRoundedRect。如果你想要更复杂的东西,比如那个 YouTube 标志,你可以使用moveToPoint 和一系列addCurveToPointaddQuadCurveToPoint

例如,这是一个近似值:

生成的:

- (void)viewDidLoad 
    [super viewDidLoad];

    CGFloat width  = MIN(self.view.bounds.size.width, self.view.bounds.size.width) * 0.7;
    CGFloat height = width * 3.0 / 4.0;
    CGSize  size   = CGSizeMake(width, height);
    CGFloat corner = width / 9.0;

    CGPoint center = CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0);

    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.path = [self roundedPathAtCenter:center size:size corner:corner].CGPath;
    layer.fillColor = [UIColor redColor].CGColor;
    layer.strokeColor = [UIColor clearColor].CGColor;
    [self.view.layer addSublayer:layer];


- (UIBezierPath *)roundedPathAtCenter:(CGPoint)center size:(CGSize)size corner:(CGFloat)corner 
    CGFloat width = size.width;
    CGFloat height = size.height;

    UIBezierPath *path = [UIBezierPath bezierPath];

    // upper left corner

    [path moveToPoint: CGPointMake(center.x - width / 2.0 + corner / 2.0, center.y - height / 2.0 + corner / 2.0)];

    // path to top center

    [path addQuadCurveToPoint: CGPointMake(center.x, center.y - height / 2.0) controlPoint: CGPointMake(center.x - width / 2.0 + corner, center.y - height / 2.0)];

    // path to upper right

    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0, center.y - height / 2.0 + corner / 2.0) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y - height / 2.0)];

    // path to mid right

    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0, center.y) controlPoint: CGPointMake(center.x + width / 2.0, center.y - height / 2.0 + corner)];

    // path to lower right

    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0, center.y + height / 2.0 - corner / 2.0) controlPoint: CGPointMake(center.x + width / 2.0, center.y + height / 2.0 - corner)];

    // path to center bottom

    [path addQuadCurveToPoint: CGPointMake(center.x, center.y + height / 2.0) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y + height / 2.0)];

    // path to lower left

    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0 + corner / 2.0, center.y + height / 2.0 - corner / 2.0) controlPoint: CGPointMake(center.x - width / 2.0 + corner, center.y + height / 2.0)];

    // path to mid left

    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0, center.y) controlPoint: CGPointMake(center.x - width / 2.0, center.y + height / 2.0 - corner)];

    // path to top left

    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0 + corner / 2.0, center.y - height / 2.0 + corner / 2.0) controlPoint: CGPointMake(center.x - width / 2.0, center.y - height / 2.0 + corner)];

    [path closePath];

    return path;

您可以使用这些控制点来获得您想要的效果。关键是你希望第一个控制点与前面圆弧的第二个控制点一致。

在这个例子中,我只是创建了一个CAShapeLayer 并将它添加为一个子层。或者,您也可以使用此CAShapeLayer 并将其作为mask 添加到其他视图的layer 中。关键是您只需要创建一个UIBezierPath 来绘制您想要的轮廓,然后直接绘制它,将其添加为子图层,或者将其用作蒙版。

【讨论】:

问题标记为 Objective-C,而不是 Swift。 针对 Objective-C 更新。【参考方案2】:

任何UIView 的圆角都必须穿过其层。 将其粘贴到新的 Xcode Playground 中:

import Foundation
import UIKit

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = UIColor.redColor()
view.layer.cornerRadius = 20.0
view

【讨论】:

问题是关于圆边,而不是圆角。这个问题被标记为 Objective-C。

以上是关于如何以编程方式在 UIview 中制作圆角和边?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式绘制圆角矩形[重复]

制作一个圆角的 UITextField

如何制作具有圆角顶角和方形底角的 UIView

如何以编程方式删除表格视图单元格中的 UIView?

如何转移UIView并使用Swift以编程方式添加新的UIView?

如何在以编程方式制作滚动视图时解决此问题?