2017-04-23 5 views
1

グラデーションレイヤを作成して、MainViewController self.viewに追加しています。 viewDidAppearインサイドモーダルビューコントローラが閉じられた後、CAGradientLayerが表示から削除される理由

override func viewDidLoad() { 
    super.viewDidLoad() 

    gradient = CAGradientLayer() 
    gradient.frame = view.bounds 
    gradient.colors = colors 
    view.layer.insertSublayer(gradient, at: 0) 

} 

私はすべてのサブレイヤを列挙しています:

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が削除されたのか理解したいと思います。

+0

'super.viewDidAppear(animated)'を呼び出す前に印刷してみましたか? –

+0

viewWillAppearで印刷する場合も同じ問題 – Kobe

+0

'UIViewController'を直接サブクラス化しましたか? –

答えて

3

簡単なテストプログラムで状況を再現できませんでした。ここで

は、勾配層がview.layersから削除されている場所を見つける

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

を定義し、あなたのCAGradientLayerviewDidLoadでローカルに作成されMyCAGradientLayerとを交換するには...いくつかのデバッグのアドバイスです。 viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    let gradient = MyCAGradientLayer() 
    gradient.frame = view.bounds 
    gradient.colors = colors 
    view.layer.insertSublayer(gradient, at: 0) 
} 

はローカル変数gradientは(view.layers配列内の1つ)が存在するgradientからgradient、唯一の参照への参照を解放する終了します。

printステートメントにブレークポイントを設定して、どこから解放されているかを確認します。

関連する問題