简体   繁体   English

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

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

I am creating a gradient layer and adding it to my MainViewController self.view. 我正在创建一个渐变图层并将其添加到我的MainViewController self.view中。

override func viewDidLoad() {
    super.viewDidLoad()

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

}

Inside viewDidAppear I am enumerating all the sublayers: viewDidAppear里面我列举了所有的子层:

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

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

This is what I get when I am running the app (which is normal): 这是我在运行应用程序时得到的结果(这是正常的):

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

Then from MainViewController I present modally another vc and then dismiss it. 然后从MainViewController我提出modally另一个vc,然后解散它。 After this MainVC viewDidAppear is called again, but this time I get this: 在再次调用此MainVC viewDidAppear之后,这次我得到了这个:

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

The CAGradientLayer was removed from self.view. CAGradientLayer已从CAGradientLayer中删除。 I can fix this by moving my code from viewDidLoad to viewDidAppear , but I want to understand why is the CAGradientLayer removed, after the controller was dismissed. 我可以通过将我的代码从viewDidLoad移动到viewDidAppear来解决这个问题,但我想了解为什么在控制器被解除后CAGradientLayer被删除了。

I was unable to reproduce your situation in a simple test program. 我无法在简单的测试程序中重现您的情况。

Here is some debugging advice... 这是一些调试建议......

To find out where the gradient layer is being removed from view.layers , define 要找出从view.layers中删除渐变图层的view.layers ,请定义

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

and replace your CAGradientLayer with MyCAGradientLayer which is created locally in viewDidLoad . 并使用在viewDidLoad本地创建的MyCAGradientLayer替换您的CAGradientLayer

override func viewDidLoad() {
    super.viewDidLoad()

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

After viewDidLoad finishes the local variable gradient will release its reference to the gradient and only one reference to the gradient will exist (the one in the view.layers array). viewDidLoad完成后,局部变量gradient将释放其对gradient引用,并且只存在一个gradient引用( view.layers数组中的view.layers )。

Set a breakpoint on the print statement to see where it is getting freed. print语句上设置断点以查看它被释放的位置。

暂无
暂无

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

相关问题 关闭另一个视图控制器后,停止重新加载视图控制器 - stop view controller from reloading after another view controller is dismissed 为什么简单的模态视图控制器在显示和关闭时会滞后? - Why would a simple modal view controller lag when presented and dismissed? 关闭时如何将数据从模态视图控制器传回 - How to pass data from modal view controller back when dismissed Modal View控制器在出现内存警告时被解雇? - Modal View controller dismissed on memory warning? 从主视图控制器知道何时解散了所提供的模态视图控制器? - Knowing from the main view controller when the presented modal view controller is dismissed? 如果当前视图控制器发生更改,如何关闭模式视图控制器? - How can a modal view controller be dismissed if the presenting view controller is changed? 为什么我的视图控制器(从故事板中以模态方式呈现)在被解雇后不会被释放? - Why does my view controller (presented modally from a storyboard segue) not get released after being dismissed? 父视图 controller 中是否有在模态视图被关闭后被调用的委托? - Is there a delegate in the parent view controller that gets called after a modal view gets dismissed? 在发送方视图控制器被解除后执行 segue - Performing segue after sender view controller is dismissed 关闭UIPopoverController后呈现视图控制器 - Presenting a View Controller after a UIPopoverController is dismissed
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM