微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。