【问题标题】:CAGradientLayer added to background but rendered on topCAGradientLayer 添加到背景但呈现在顶部
【发布时间】:2020-07-05 14:22:41
【问题描述】:

我正在使用此代码添加背景层:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = view.bounds
        gradientLayer.colors = [UIColor.red.cgColor,
                                UIColor.yellow.cgColor,
                                UIColor.green.cgColor,
                                UIColor.blue.cgColor]
    
        view.layer.addSublayer(gradientLayer)

当我运行应用程序时 - 背景出现在我拥有的标签之上。

但是,当我检查调试视图层次结构时 - 一切都正常显示。检查下面的屏幕截图:

我尝试将标签放在单独的视图中,然后将 CAGradientLayer 添加到超级视图,但它仍然绘制在顶部。

你可以在这里查看层次结构:

【问题讨论】:

  • 解决此问题的一种简单方法是创建一个 UIView 并将所有标签添加到该视图。然后将此视图添加为添加渐变层的视图的子视图。使新视图的背景颜色清除颜色
  • @AthulSethu 我试过你的建议,但结果是一样的。我已经添加了我在原始帖子中所做的事情。不知道我做错了什么。
  • 你有没有检查过它是否在iOS 13或其他模拟器中工作,或者打印sublayers 来检查这些层的顺序?

标签: ios swift


【解决方案1】:

试试吧

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

经过测试并适用于 Xcode 12 / iOS 14

    // just added to some other test controller
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = self.view.bounds
        gradientLayer.colors = [UIColor.red.cgColor,
                                UIColor.yellow.cgColor,
                                UIColor.green.cgColor,
                                UIColor.blue.cgColor]

        self.view.layer.insertSublayer(gradientLayer, at: 0)  // << here !!
    }

【讨论】:

  • 不起作用。当我添加它时,我在行上收到“调用中的额外参数”错误。
  • @SaltyLemon 你确定你使用了insertSublayer,如图所示?这里使用了 API open func insertSublayer(_ layer: CALayer, at idx: UInt32)
  • 我仍在使用addSublayer 而不是insertSublayer,这就是我遇到此问题的原因。根据您的建议切换后,现在一切正常。
猜你喜欢
  • 2016-05-27
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多