插入

时间:2017-02-13 23:26:50

标签: ios iphone swift ipad

我有一个类函数来创建一个CAGradient图层并将其插入到一个工作正常的UIView中。

但是,我希望在显示页面后修改渐变,并且重新执行相同的功能不起作用。

在显示的页面上,我使用滑块将新颜色设置为两个UIButton背景,然后调用下面的函数。我在改变滑块时期望渐变图层背景发生变化,但它并没有改变。我已经确认正在调用该函数并且颜色值有效。

如何在移动滑块时更改渐变?

这里是班级职能:

class func setGradientBG(_ firstColor: CGColor, secondColor: CGColor, vertical: Bool, thisView: UIView){
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = thisView.bounds
    gradientLayer.colors = [firstColor, secondColor]
    gradientLayer.locations = [0.0, 1.2]
    if !vertical{
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0)
    }
    thisView.layer.insertSublayer(gradientLayer, at: 0)
}

这是从滑块调用的函数:

func doSlider(){
   CommonFuncs.setGradientBG((self.TopColorBut.backgroundColor?.cgColor)!,  secondColor: (self.BottomColorBut.backgroundColor?.cgColor)!, vertical: true, thisView: self.view)
}

2 个答案:

答案 0 :(得分:1)

每次拨打CAGradientLayer时,您都会添加setGradientBG的另一个实例。你真的认为这是一个好主意吗?

看起来您的doSlider方法可能是自定义UIViewController子类的一部分。您应该做的是在视图控制器中存储对渐变图层的引用,并更新该现有图层。例如:

class ViewController: UIViewController {

    private let gradientLayer = CAGradientLayer()

    @IBOutlet var topColorButton: UIButton!
    @IBOutlet var bottomColorButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.layer.insertSublayer(gradientLayer, at: 0)
        self.updateGradientLayer()
    }

    @IBAction func doSlider() {
        updateGradientLayer()
    }

    private func updateGradientLayer() {
        gradientLayer.locations = [ 0.0, 1.2 ]
        gradientLayer.startPoint = .zero
        gradientLayer.endPoint = CGPoint(x: 0, y: 1)
        gradientLayer.colors = [
            (topColorButton.backgroundColor ?? .clear).cgColor,
            (bottomColorButton.backgroundColor ?? .clear).cgColor ]
    }

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

}

答案 1 :(得分:0)

子图层按顺序列出。所以最后插入新的子图层。或者删除旧的。