2017-04-23 80 views
1

我正在创建渐变图层并将其添加到我的MainViewController self.view中。为什么CAGradientLayer在取消模态视图控制器后从视图中删除

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) 
    } 
} 

这是我所得到的,当我运行的应用程序(这是正常的):从MainViewController

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

然后我以模态方式呈现另一个vc,然后解雇它。在此之后MainVC viewDidAppear再次调用,但这次我得到这个:

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

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

+0

你在调用'super.viewDidAppear(animated)'之前是否尝试过打印? –

+0

同样的问题,如果我打印viewWillAppear – Kobe

+0

你直接'UIViewController'继承吗? –

回答

3

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

下面是一些调试建议...

找出梯度层正在从view.layers删除,定义

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

和你CAGradientLayer与在viewDidLoad本地创建MyCAGradientLayer更换。

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阵列中)。

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

相关问题