如何添加精确填充视图框的渐变图层

时间:2018-01-30 12:03:23

标签: ios swift4 cagradientlayer

在我的应用程序中,我将渐变图层添加到UIView和UIToolBar,但它不会完全填充视图 enter image description here enter image description here

    let gradient:CAGradientLayer = CAGradientLayer()
    gradient.frame               =  self.vw_gradientForToolBar.bounds
    gradient.colors              = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
    gradient.startPoint = CGPoint(x: 0, y: 0)
    gradient.endPoint = CGPoint(x: 0.5, y: 0)

    UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0.0)
    let img : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    self.toolBar.setBackgroundImage(img, forToolbarPosition: .any, barMetrics: .default)
    vw_gradientForToolBar.layer.addSublayer(gradient)

查看Hirarchy

enter image description here

在此输入图片说明

1 个答案:

答案 0 :(得分:1)

根据您发布的图片,确切地说出您的情况有点难以理解......但这可能会为您简化。

首先,请记住,图层不会自动缩放,因此当工具栏更改大小(不同的设备,设备旋转等)时,您希望渐变图层调整大小。最好的方法是使用UIView子类并覆盖layoutSubviews()

因此,将此类添加到您的代码中:

class GradientView: UIView {

    override class var layerClass: AnyClass {
        return CAGradientLayer.self
    }

    override func layoutSubviews() {
        let gradientLayer = layer as! CAGradientLayer
        gradient.colors = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
        gradientLayer.startPoint = CGPoint(x: 0, y: 0)
        gradientLayer.endPoint = CGPoint(x: 0.5, y: 0)
    }

}

然后在你的控制器的viewDidLoad()功能中:

override func viewDidLoad() {
    super.viewDidLoad()

    let vwGrad = GradientView()
    vwGrad.frame = toolBar.frame
    vwGrad.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.toolBar.insertSubview(vwGrad, at: 0)

}

注意:您将不再需要vw_gradientForToolBar(我假设,UIView是通过@IBOutlet连接的。{/ p>