问题描述
我希望 UIView
或 CALayer
的每个角都有不同的半径,但是不要明确引用 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
的主层上设置不同的角半径(因此 CALayer
或 UIView
的边界将自动更新),我将非常感激!
解决方法
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