在Swift中制作渐变背景 - 正确的方法

时间:2016-05-13 14:18:48

标签: swift cagradientlayer ibdesignable

这是我的渐变背景代码。当我将它应用于我的视图时,它会隐藏在VC上的所有内容,就像它在前面一样,其他一切都被推回去了。如何制作不会干扰我的元素的渐变视图?

我正在使用@IBDesignable看看它是如何在Storyboard中看的。

import UIKit

@IBDesignable
class GradientView: UIView {

    private let gradientLayer = CAGradientLayer()

    var color1 = ColorPalette.GrdTop
    var color2 = ColorPalette.GrdBottom

    override init(frame: CGRect) {
        super.init(frame: frame)
        configureGradient()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        configureGradient()
    }

    func configureGradient() {
        gradientLayer.startPoint = CGPoint(x: 0, y: 0)
        gradientLayer.endPoint = CGPoint(x: 1, y: 1)
        updateColors()
        layer.addSublayer(gradientLayer)
    }

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

    private func updateColors() {
        gradientLayer.colors = [color1.CGColor, color2.CGColor]
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        configureGradient()
    }
}

1 个答案:

答案 0 :(得分:1)

  

喜欢它在前面,其他一切都被推回

因为前面的。想想你的代码行:

layer.addSublayer(gradientLayer)

将梯度图层放在该图层的所有其他子图层的前面。视图的子视图由其图层的子图层显示,因此渐变图层覆盖此视图的当前子视图。

如果您愿意,可以将图层一直插入后面(insertSublayer:atIndex:)。但是,优雅的解决方案是为此视图实现the layerClass class method以返回CAGradientLayer。现在,您不必向GradientView添加渐变;相反,您的GradientView 渐变,您可以根据需要配置该渐变。