我正在为更大的应用程序设计渐变背景,并创建了这个虚拟应用程序以简化概念。该视图具有50/50渐变背景和2行彩色按钮。

我希望用户能够通过点击上,下按钮来使用渐变的颜色,以便渐变背景根据按钮的颜色而变化。

ios - 实时更改 View 渐变背景-LMLPHP

ViewController的代码如下:

    import UIKit

    class ViewController: UIViewController {

        var currentUpperColor = UIColor.black
        var currentLowerColor = UIColor.white

        override func viewDidLoad() {
            super.viewDidLoad()

            setGradientBackground(lowerColor: currentLowerColor, upperColor: currentUpperColor)
        }

        func setGradientBackground(lowerColor: UIColor, upperColor: UIColor) {

            let gradientLayer = CAGradientLayer()
            gradientLayer.frame = view.bounds
            gradientLayer.colors = [lowerColor.cgColor, upperColor.cgColor]
            gradientLayer.locations = [0.5, 1.0]
            gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
            gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)

            view.layer.insertSublayer(gradientLayer, at: 0)

        }

        @IBAction func upperColorPicked(_ sender: UIButton) {
            currentUpperColor = sender.backgroundColor!
            setGradientBackground(lowerColor: currentLowerColor, upperColor: currentUpperColor)
        }

        @IBAction func lowerColorPicked(_ sender: UIButton) {
            currentLowerColor = sender.backgroundColor!
            setGradientBackground(lowerColor: currentLowerColor, upperColor: currentUpperColor)
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }


}

但是,当应用程序运行时,轻按按钮不会发生任何事情。我知道应该发生某种视图重绘,但是我不确定如何调用它。

最佳答案

原因

view.layer.insertSublayer(gradientLayer, at: 0)

将始终在索引0处插入渐变层。最初,您创建了一个具有黑白颜色的层并添加到位置0。现在,当用户选择一种新颜色时,您将创建一个新层并将其添加到索引0中,从而使黑白层成为在索引1处。因此,只有黑色和白色层会始终出现

解决方案:

删除旧层并添加新层。

步骤1:

声明gradientLayer作为实例变量
class ViewController: UIViewController {
    var gradientLayer = CAGradientLayer()
     ....
 }

步骤2:

在IBAction中,删除旧层并添加新层
@IBAction func upperColorPicked(_ sender: UIButton) {
            self.gradientLayer.removeFromSuperlayer()
            currentUpperColor = sender.backgroundColor!
            setGradientBackground(lowerColor: currentLowerColor, upperColor: currentUpperColor)
        }

        @IBAction func lowerColorPicked(_ sender: UIButton) {
            self.gradientLayer.removeFromSuperlayer()
            currentLowerColor = sender.backgroundColor!
            setGradientBackground(lowerColor: currentLowerColor, upperColor: currentUpperColor)
        }

解决方案2 :(不是首选方法)

如果您想用不同的颜色堆叠图层(我个人没有这样做的理由,但是如果那是您想要的),则可以使用
view.layer.insertSublayer(CALayer(), at: UInt32(view.layer.sublayers?.count ?? 0))

因此,将setGradientBackground修改为
func setGradientBackground(lowerColor: UIColor, upperColor: UIColor) {

            let gradientLayer = CAGradientLayer()
            gradientLayer.frame = view.bounds
            gradientLayer.colors = [lowerColor.cgColor, upperColor.cgColor]
            gradientLayer.locations = [0.5, 1.0]
            gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
            gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)

            view.layer.insertSublayer(CALayer(), at: UInt32(view.layer.sublayers?.count ?? 0))

        }

关于ios - 实时更改 View 渐变背景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46769329/

10-15 15:29