[英]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.