【问题标题】:Swift: How to set a different radii for each corner of a UIView or CALayer without explicitly using a CGRect?Swift:如何在不显式使用 CGRect 的情况下为 UIView 或 CALayer 的每个角设置不同的半径?
【发布时间】:2021-04-07 09:48:54
【问题描述】:

我希望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,所以,当我的设备旋转时,一切都坏了。我可以更新layoutSubviews() 中的CGRect,但是,这是延迟 as shown in this article.

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

【问题讨论】:

    标签: ios swift autolayout uikit calayer


    【解决方案1】:

    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
    }()
    

    所有 4 个角:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多