iOS - CALayer 在方向变化时突出边界

iOS - CALayer protruding bounds on orientation change

我有一个简单的CustomView。我有一个要添加到 layer.

CAGradientLayer
@IBDesignable
class CustomView: UIView {
    
    override init (frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        setupView()
    }
    
    private func setupView() {
        let gradient = CAGradientLayer()

        gradient.frame = bounds
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]

        layer.insertSublayer(gradient, at: 0)
    }
}

下面是 Storyboard 设置

下面是 iPad 上的纵向结果,很好。

当设备方向改变时,CustomView 的层从其边界突出。

当我检查 Xcode 中的视图层次结构时,CustomView 的框架相应地进行了调整,但是突出的是图层。为了交叉检查,我删除了 setupView 中的所有代码并仅设置了背景颜色,在方向更改时,CustomView 已按预期进行了调整。但是,为什么图层会发生这种情况?

每次 layoutSubviews 方法调用时,您都在插入一个新层。也就是说它显示了第一层的线。

只需更新 layoutSubviews 的框架并调用 awakeFromNib 的设置方法。

class CustomView: UIView {
    private let gradient = CAGradientLayer()
    
    override init (frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        gradient.frame = bounds
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        setupView()
    }
    
    private func setupView() {
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
        
        layer.insertSublayer(gradient, at: 0)
    }
}