为什么在关闭模态视图控制器后从视图中删除 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
我模态地呈现另一个 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
语句上设置断点以查看它在何处被释放。
我正在创建渐变层并将其添加到我的 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
我模态地呈现另一个 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
语句上设置断点以查看它在何处被释放。