为什么 UIView 的边缘对于巨大的圆角半径不平滑?

Why the edges of UIView are not smooth for huge corner radius?

class AttributedView: UIView {
    private let gradient = CAGradientLayer()
    var cornerRadius: CGFloat = 3 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }
}

我只是将它用于:按钮视图(角半径:20)和背景圆(角半径:600)。

为什么按钮是平滑的,而背景不是?

您应该使用贝塞尔曲线路径并绘制圆圈。之后您将获得漂亮、光滑的边缘。

let context = UIGraphicsGetCurrentContext()!
let gradient = CGGradient(colorsSpace: nil, colors: [UIColor.red.cgColor, UIColor.white.cgColor] as CFArray, locations: [0, 1])!
let ovalPath = UIBezierPath(ovalIn: CGRect(x: 64, y: 9, width: 111, height: 93))
context.saveGState()
ovalPath.addClip()
context.drawLinearGradient(gradient, start: CGPoint(x: 119.5, y: 9), end: CGPoint(x: 119.5, y: 102), options: [])
context.restoreGState()

您可能应该裁剪此视图的边界:

attributedView.clipsToBounds = true

UIBezierPath 是一个简单高效的 class 用于使用 Swift 绘制形状,然后您可以将其放入 CAShapeLayer、SKShapeNode 或其他地方。它内置了各种形状,因此您可以像这样编写代码来创建圆角矩形或圆形:

let rect = CGRect(x: 0, y: 0, width: 256, height: 256)
let roundedRect = UIBezierPath(roundedRect: rect, cornerRadius: 50)
let circle = UIBezierPath(ovalIn: rect)

您还可以通过将笔移动到起始位置然后添加线条来创建自定义形状:

let freeform = UIBezierPath()
freeform.move(to: .zero)
freeform.addLine(to: CGPoint(x: 50, y: 50))
freeform.addLine(to: CGPoint(x: 50, y: 150))
freeform.addLine(to: CGPoint(x: 150, y: 50))
freeform.addLine(to: .zero)

如果您的最终结果需要 CGPath,您可以通过访问 UIBezierPath 的 cgPath 属性 来获得。

使用iOS 13.0你可以简单的做,除了设置角半径

yourView.layer.cornerCurve = .continuous