【问题标题】:How to set a gradient using CAGradientLayer to a UIView (subview) in swift programatically?如何以编程方式快速使用 CAGradientLayer 将渐变设置为 UIView(子视图)?
【发布时间】:2020-09-24 14:25:27
【问题描述】:
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        view.addSubview(container)
        container.customAcnhor(top: view.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 350)
        
    }

    let container : UIView = {
        var view = UIView()
        let gradient = CAGradientLayer()
        gradient.frame = view.bounds
        gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
        view.layer.insertSublayer(gradient, at: 0)
        
        return view
    }()
}

代码上下文

上面的类有一个container,它的类型是UIView,它包含一个CAGradientLayer。我正在尝试将渐变显示到一个 subview,我将在其中将此容器(子视图)添加到主视图。
下面是一个类似的例子,说明我想如何实现这一点。图片上的蓝色需要有我的自定义渐变。
有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: ios swift uiview subview cagradientlayer


    【解决方案1】:

    您可能需要在布置container view 后再次设置gradient layer 的框架。

    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            view.addSubview(container)
            container.customAcnhor(top: view.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 350)
            gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
        }
        let gradient = CAGradientLayer()
    
        lazy var container : UIView = {
            var view = UIView()
            view.layer.insertSublayer(gradient, at: 0)
            return view
        }()
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            gradient.frame = container.bounds
        }
    }
    

    【讨论】:

    • 这使整个屏幕带有渐变。但我只想要屏幕的一部分。如上图所示,渐变应仅应用于屏幕的蓝色部分。
    • 你在设置gradient.frame = container.bounds吗?
    • 是的,我这样做了,但它仍然显示一个空白屏幕。
    • 您确定您的视图显示正确吗?
    • 是的,当我尝试执行 gradient.frame = view.bounds 时,我会得到整个屏幕的渐变效果,但是当我尝试执行 gradient.frame = container.bounds 时,它只会在模拟器上显示空白屏幕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多