LaunchScreen.storyboard はアニメーションできない
アニメーションするLaunchScreen を作ろうとして、LaunchScreen.storyboard に、独自のクラスを適用してみたところ、”Launch screens may not set custom classnames” というエラーが発生する。このため、Launch Screenではアニメーションができない。
起動画面にViewController により、アニメーションを行なう
そこで、起動画面に ViewController によりアニメーションを表示し、アニメーションが終わったら、メインのViewController に遷移する方法を試みる。
遷移先のメインのViewController に Storyboard ID を付与する。
LaunchScreen の代わりとなる ViewController を追加する。
SplashViewController.swift を追加し、カスタムクラスを設定・実装する。
SplashViewController は次のとおり。
import UIKit class SplashViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let storyboard = UIStoryboard(name: "Main", bundle: nil) let nextViewController = storyboard.instantiateViewController(withIdentifier: "mainViewController") self.present(nextViewController, animated: true, completion: nil) } }
注意
instantiateViewController をviewDidLoad() から呼び出すと、次の警告が表示されて、Viewの遷移ができない。
Warning: Attempt to present <***.ViewController: 0x104910db0> on <***.SplashViewController: 0x10490a030> whose view is not in the window hierarchy!
原因については、次の記事にあるように、まだ ViewController が存在していないのに、遷移しようとしたため。
対応としては、上記のように viewDidAppear の中で遷移する。
whose view is not in the window hierarchy! 初心者向け エラー
LaunchScreen のガイドライン
Launch Screen – Apple Developer により
重要
起動画面に static 画像を使用しないでください。デバイスの画面サイズと向き」を参照してください。
アプリの最初の画面と同じ起動画面
アプリの起動が完了したときに外観が異なる要素を含めると、起動画面とアプリの最初の画面の間で不快なフラッシュが発生する可能性があります。また、起動画面がデバイスの現在の外観モードと一致していることを確認してください。
起動画面にテキストを含めない
起動画面のコンテンツは変更されないため、表示されるテキストはローカライズされません。
高速な起動
あまり凝ったローンチスクリーンは避けて、コンテンツにすばやくアクセスしてタスクを実行できるようにする。
宣伝しない
起動画面はブランディングの機会ではありません。スプラッシュ画面や「About」ウィンドウのようなエントリエクスペリエンスを設計しないでください。ロゴやその他のブランド要素は、アプリの最初の画面の固定部分でない限り、含めないでください。ゲームまたは他のイマーシブアプリが最初の画面に移行する前に無地を表示する場合、その無地のみを表示する起動画面を作成できます。
ということなので、高速、シンプル、Autoresizable、宣伝なしの Launch Screen を設計する必要がある。