繁体   English   中英

为什么在取消模态视图控制器后从视图中删除CAGradientLayer

[英]Why is the CAGradientLayer removed from view after modal view controller is dismissed

我正在创建一个渐变图层并将其添加到我的MainViewController self.view中。

override func viewDidLoad() {
    super.viewDidLoad()

    gradient = CAGradientLayer()
    gradient.frame = view.bounds
    gradient.colors = colors
    view.layer.insertSublayer(gradient, at: 0)

}

viewDidAppear里面我列举了所有的子层:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    for x in (view.layer.sublayers)! {
        print(x)
    }
}

这是我在运行应用程序时得到的结果(这是正常的):

<CAGradientLayer: 0x608000224120>
<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>

然后从MainViewController我提出modally另一个vc,然后解散它。 在再次调用此MainVC viewDidAppear之后,这次我得到了这个:

<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>

CAGradientLayer已从CAGradientLayer中删除。 我可以通过将我的代码从viewDidLoad移动到viewDidAppear来解决这个问题,但我想了解为什么在控制器被解除后CAGradientLayer被删除了。

我无法在简单的测试程序中重现您的情况。

这是一些调试建议......

要找出从view.layers中删除渐变图层的view.layers ,请定义

class MyCAGradientLayer: CAGradientLayer {
    deinit {
        print("there it goes")
    }
}

并使用在viewDidLoad本地创建的MyCAGradientLayer替换您的CAGradientLayer

override func viewDidLoad() {
    super.viewDidLoad()

    let gradient = MyCAGradientLayer()
    gradient.frame = view.bounds
    gradient.colors = colors
    view.layer.insertSublayer(gradient, at: 0)
}

viewDidLoad完成后,局部变量gradient将释放其对gradient引用,并且只存在一个gradient引用( view.layers数组中的view.layers )。

print语句上设置断点以查看它被释放的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM