簡體   English   中英

為什么在取消模態視圖控制器后從視圖中刪除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我提出modally另一個vc,然后解散它。 在再次調用此MainVC viewDidAppear之后,這次我得到了這個:

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

CAGradientLayer已從CAGradientLayer中刪除。 我可以通過將我的代碼從viewDidLoad移動到viewDidAppear來解決這個問題,但我想了解為什么在控制器被解除后CAGradientLayer被刪除了。

我無法在簡單的測試程序中重現您的情況。

這是一些調試建議......

要找出從view.layers中刪除漸變圖層的view.layers ,請定義

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

並使用在viewDidLoad本地創建的MyCAGradientLayer替換您的CAGradientLayer

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數組中的view.layers )。

print語句上設置斷點以查看它被釋放的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM