首页 > 解决方案 > 以编程方式在 Swift 中创建背景渐变

问题描述

所以通常要创建渐变我可能有以下内容UIViewController

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = view.bounds
        gradientLayer.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
        gradientLayer.shouldRasterize = true
        view.layer.addSublayer(gradientLayer)
    }
}

但是,当我以编程方式创建 ViewController 时,我想要等效的。

我尝试了以下方法:

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .red
        self.view = view
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let bgView = UIView()
        bgView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = view.bounds
        gradientLayer.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
        gradientLayer.shouldRasterize = true
        bgView.layer.addSublayer(gradientLayer)
        self.view.addSubview(bgView)
}

但我看到的都是红色背景色。

如何以编程方式添加背景渐变?

标签: swift

解决方案


bgView.zero框架,所以里面的任何东西都是不可见的。

let bgView = UIView()

// Add this line
bgView.frame = view.bounds

bgView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

更新

似乎view.bounds宽度/高度为零,这导致bgView在屏幕上不可见。

在添加此渐变之前,您可以尝试等待子视图正确布局。

class ViewController: UIViewController {
    
    override func loadView() {
        // This view has zero frame here
        let view = UIView()
        
        // Do you see red color on your screen at all?
        view.backgroundColor = .red
        
        // If you don't see red color on your screen at all
        // then you need to fix the frame for your view
        view.frame = UIScreen.main.bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        
        self.view = view
    }

    private lazy var gradientLayer: CAGradientLayer = {
        let gradient = CAGradientLayer()
        gradient.colors = [#colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1).cgColor, UIColor(red: 252/255, green: 238/255, blue: 33/255, alpha: 1).cgColor]
        gradient.shouldRasterize = true
        return gradient
    }()

    private lazy var bgView: UIView = {
        let bg = UIView()
        bg.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        return bg
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.addSubview(bgView)
        bgView.layer.addSublayer(gradientLayer)
    }

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

推荐阅读