2.4K Views
February 14, 24
スライド概要
YUMEMI.grow Mobile #10 - connpass
https://yumemi.connpass.com/event/308122/
viewIsAppearingの話をしました #yumemi_grow - usami-kの日記
https://usami-k.hatenablog.com/entry/2024/02/14/225600
https://usami-k.github.io/
ViewControllerのライフサイクル: viewIsAppearing 宇佐見公輔 / 株式会社ゆめみ 2024-02-14 ViewControllerのライフサイクル:viewIsAppearing 1
自己紹介 宇佐見公輔(うさみこうすけ) 株式会社ゆめみ / iOSテックリード 前回のYUMEMI.grow Mobile SwiftのObservationフレームワークによる値の監視 最近、コンタクトレンズを試している Apple Vision Pro対応 まだ慣れないのでメガネと併用 ViewControllerのライフサイクル:viewIsAppearing 2
viewIsAppearingとは UIViewControllerのライフサイクルのひとつ。 昨年6月のWWDC23で発表 最新のiOS 17だけでなく、iOS 13以降で使える iOSで過去のバージョンへのbackportがあるのは珍しい 公式ドキュメントが詳しい 今回の話の多くは公式ドキュメントに記載されている ViewControllerのライフサイクル:viewIsAppearing 3
UIViewControllerのライフサイクル 特定のタイミングで のメソッドが呼ばれる。 Viewのロード後 Viewの表示前 子Viewのレイアウト前 子Viewのレイアウト後 Viewの表示後 UIViewController viewDidLoad viewWillAppear viewWillLayoutSubviews viewDidLayoutSubviews viewDidAppear ViewControllerのライフサイクル:viewIsAppearing 4
ライフサイクルでの処理の実装 処理を実行したい場合、overrideする。 final class MyViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // } 実行したい処理を書く } ViewControllerのライフサイクル:viewIsAppearing 5
今回の追加 viewDidLoad viewWillAppear viewIsAppearing ←ここ viewWillLayoutSubviews viewDidLayoutSubviews viewDidAppear 図は公式ドキュメントを引用 ViewControllerのライフサイクル:viewIsAppearing 6
viewWillAppearとviewIsAppearing 画面表示前の処理で、従来の定番は だった。 これが でもできるようになった。 実行順 viewWillAppear viewIsAppearing viewWillAppear ViewControllerのViewがView階層に追加 ViewControllerのViewが親Viewにレイアウトされる viewIsAppearing ViewControllerのライフサイクル:viewIsAppearing 7
viewIsAppearingでできること たとえば次のようなことができる。 スクロール位置の調整 より正確に調整できる Trait Collectionの参照 ではまだ更新されていない viewWillAppear viewWillAppear ViewControllerのライフサイクル:viewIsAppearing 8
Trait Collectionについて トレイトシステムはiOS 17で更新されている。 iOS 16までは、デバイスの向きやダークモードの切り替えなど ライトモード / ダークモード コンパクト / レギュラー iOS 17では、カスタムトレイトを追加できる また、トレイトの更新伝播の仕組みが変わっている (今回は詳細は割愛) ViewControllerのライフサイクル:viewIsAppearing 9
使い分け viewWillAppear viewDidDisappear と対になる処理 viewIsAppearing ViewControllerのViewがレイアウトされた後の処理 Trait Collectionの参照 ViewControllerのライフサイクル:viewIsAppearing 10
viewIsAppearingと viewWillLayoutSubviews 呼ばれる順番的には似ているが、呼ばれる回数が異なる。 viewIsAppearing 画面表示時に1回だけ呼ばれる viewWillLayoutSubviews 複数回呼ばれる layoutSubviews() のたびに呼ばれる ViewControllerのライフサイクル:viewIsAppearing 11
注意点 遷移元 遷移先 遷移先 キャンセル 遷移先 遷移元 遷移元 viewWillDisappear viewWillAppear viewIsAppearing viewWillDisappear viewWillAppear viewIsAppearing ViewControllerのライフサイクル:viewIsAppearing 12
注意点 スワイプで戻る→キャンセル、を考慮する。 が複数回呼ばれる可能性はある。 が複数回呼ばれる可能性はある。 どちらも、 の処理と干渉する処理を入れてしま うとバグの原因になる。 とくに、遷移元も遷移先も同じNavigationControllerを参照している 点に注意。 viewWillAppear viewIsAppearing viewWillDisappear ViewControllerのライフサイクル:viewIsAppearing 13
実際の例 ツールバーの表示・非表示 標準のツールバーはNavigationControllerに属する 以下の処理は、問題になるおそれがある や でツールバー表示 でツールバー非表示 viewWillAppear viewIsAppearing viewWillDisappear ViewControllerのライフサイクル:viewIsAppearing 14
まとめ 今後は viewIsAppearing も適切に活用すると良い。 ViewControllerのライフサイクル:viewIsAppearing 15