为什么CAGradientLayer在取消模态视图控制器后从视图中删除
问题描述:
我正在创建渐变图层并将其添加到我的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
被删除。
答
我无法在简单的测试程序中重现您的情况。
下面是一些调试建议...
找出梯度层正在从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
语句中设置一个断点以查看它被释放的位置。
你在调用'super.viewDidAppear(animated)'之前是否尝试过打印? –
同样的问题,如果我打印viewWillAppear – Kobe
你直接'UIViewController'继承吗? –