我正在创建一个渐变图层并将其添加到我的input type = 'file'
self.view。
MainViewController
在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>
我以模态方式呈现另一个vc,然后将其解雇。在再次调用MainVC MainViewController
之后,这次我得到了这个:
viewDidAppear
已将<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>
从self.view中移除。我可以通过将代码从CAGradientLayer
移到viewDidLoad
来解决此问题,但我想了解为什么在控制器被解除后删除了viewDidAppear
。
答案 0 :(得分:3)
我无法在简单的测试程序中重现您的情况。
这是一些调试建议......
要找出从view.layers
移除渐变图层的位置,请定义
class MyCAGradientLayer: CAGradientLayer {
deinit {
print("there it goes")
}
}
并将CAGradientLayer
替换为MyCAGradientLayer
中本地创建的viewDidLoad
。
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
的一个引用({{1}中的引用数组)。
在view.layers
语句上设置断点,以查看它被释放的位置。