Swift:旋转时渐变分裂

Swift: Gradient splits on rotation

简而言之,我有一个混合了深蓝色和黑色的渐变。渐变看起来很漂亮,但是当我旋转屏幕并将其置于横向时,两种颜色分开,屏幕的一半是蓝色背景,另一半是黑色。发现我没有做对,我从这两个来源复制了代码:

YouTube 视频 https://www.youtube.com/watch?v=pabNgxzEaRk

网站http://blog.apoorvmote.com/gradient-background-uiview-ios-swift/

这是我的代码:

    let topColor = UIColor(red: 28/255.0, green: 25/255.0, blue: 127/255.0, alpha: 1)
    let bottomColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 25/255.0, alpha: 1)

    let gradientColors: [CGColor] = [topColor.CGColor, bottomColor.CGColor]
    let gradientLocations: [Float] = [0.0, 1.0]

    let gradientLayer: CAGradientLayer = CAGradientLayer()
    gradientLayer.colors = gradientColors
    gradientLayer.locations = gradientLocations

    gradientLayer.frame = self.view.bounds
    self.view.layer.insertSublayer(gradientLayer, atIndex: 0)

有人可以指出正确的方向来阻止我的渐变一分为二吗?

请记住,当更改屏幕方向时,所有视图的边界也会发生变化(假设您使用的是自动布局),但同样的事情不会应用于以编程方式添加的图层。因此,在您的情况下,渐变层仍然具有根据旋转前的旧视图边界设置的框架。为了解决这个问题,我建议子类化你的渐变视图并在 layoutSubviews 函数中更新渐变层框架,该函数在每次视图边界更改时调用。

class GradientView: UIView {

    let gradientLayer = CAGradientLayer()

    override func awakeFromNib() {
        gradientLayer.frame = self.bounds
        gradientLayer.colors = yourColors
        gradientLayer.locations = yourLocations
        self.layer.addSublayer(gradientLayer)
    }

    override func layoutSubviews() {
        gradientLayer.frame = self.bounds
    }
}

您只需重写 layoutSubview 方法即可根据您设备的视图自动调整渐变视图的大小

只写,

override func viewDidLayoutSubviews() {
    gradientLayer.frame = self.view.bounds
}

我试过了,效果很好。希望对你有帮助。