Swift:如何在不显式使用 CGRect 的情况下为 UIView 或 CALayer 的每个角设置不同的半径?

问题描述

我希望 UIViewCALayer 的每个角都有不同的半径,但是不要明确引用 CGRect

例如,我做了一些类似的事情:

layer.cornerRadius = 4
let maskPath = UIBezierPath(roundedRect: bounds,byRoundingCorners: [.topLeft,.topRight,.bottomLeft],cornerRadii: CGSize(width: 18.0,height: 0.0))
let maskLayer = CAShapeLayer()
maskLayer.path = maskPath.cgPath
layer.mask = maskLayer

然而,这依赖于 bounds CGRect,因此,当我的设备旋转时,一切都坏了。我可以更新 CGRect 中的 layoutSubviews(),但是,这是延迟 as shown in this article.

如果有人知道如何在 UIView 的主层上设置不同的角半径(因此 CALayerUIView 的边界将自动更新),我将非常感激!

解决方法

This 应该可以帮助您。来自文章:

在 iOS 11 中,Apple 引入了一个名为 maskedCorners 的新属性,用于 核心动画层(CALayer)。此属性的类型 CACornerMask,有 4 个可能的值:

layerMaxXMaxYCorner – 右下角

layerMaxXMinYCorner – 右上角

layerMinXMaxYCorner – 左下角

layerMinXMinYCorner – 左上角

默认值为 maskedCorners 设置为显示所有四个角。现在,让我们说 你只想圆顶角。您可以将 maskedCorners 设置为 以下内容:

self.view.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner]

示例:

lazy var viewWithTopCornersRounded: UIView = {
    let view = UIView()
    view.layer.masksToBounds = true
    view.layer.cornerRadius = 4
    view.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner] // top left and top right will be rounded
    return view
}()

四个角:

yourView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner,.layerMaxXMaxYCorner]
yourView.layer.masksToBounds = true
yourView.layer.cornerRadius = 4