【问题标题】:CAGradientLayer not applying to the full view in programmatically created UICAGradientLayer 不适用于以编程方式创建的 UI 中的完整视图
【发布时间】:2020-12-21 06:12:39
【问题描述】:

我正在开发一个以编程方式创建其所有 UI 的 iOS 项目。不是故事板。

我想给 UIViewController 的 UIView 的背景添加一个渐变。

我创建了以下扩展方法。

extension UIView {
    
    func addGradient(colors: [UIColor]) {
        let gradientLayer = CAGradientLayer()
        gradientLayer.bounds = bounds
        gradientLayer.colors = colors.map { $0.cgColor }
        layer.insertSublayer(gradientLayer, at: 0)
    }
    
}

我像这样在 ViewController 的viewDidLoad 中添加了渐变。

let topColor = UIColor(red: 0.28, green: 0.521, blue: 0.696, alpha: 1)
let bottomColor = UIColor(red: 0.575, green: 0.615, blue: 0.692, alpha: 1)
view.addGradient(colors: [topColor, bottomColor])

但渐变并未应用到屏幕的全宽和全高。

我打印出视图的边界,它显示了这些值。

(0.0, 0.0, 375.0, 812.0)

所以我不确定为什么渐变仍然没有覆盖整个视图。

【问题讨论】:

  • in View 是否布局子视图更新了渐变的框架,不应该设置边界,改用框架
  • @PrashantTukadiya 我也试过了。仍然没有改变任何东西。
  • @matt 我将渐变设置代码移到了viewDidLayoutSubviews,但由于某种原因它仍然不起作用。 Demo

标签: ios swift calayer bounds cagradientlayer


【解决方案1】:

addGradient(colors:) 方法中设置gradientLayer's frame 而不是bounds,即

func addGradient(colors: [UIColor]) {
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = bounds //here.....

    //rest of the code...
}

另外,按照建议将您的代码移动到 viewDidLayoutSubviews() 方法,

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let topColor = UIColor(red: 0.28, green: 0.521, blue: 0.696, alpha: 1)
    let bottomColor = UIColor(red: 0.575, green: 0.615, blue: 0.692, alpha: 1)
    view.addGradient(colors: [topColor, bottomColor])
}

这是因为,gradient's frame 必须在每次 view's 布局发生任何更改时更改。例如,纵向和横向。

【讨论】:

    【解决方案2】:

    当我们将视图边界添加到渐变层框架时,我们必须更新 viewDidLayoutSubviews 中的框架。这对我来说可以 以下为我工作

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        self.gradient.frame = containerView.bounds
    }
    

    containerView 是我设置渐变层的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多