iOS
Swift:AppDelegateのrootViewControllerをメインまたはログイン/オンボーディングフローを表示するように変更する
サーチ…
前書き
あなたのアプリケーションの新しいユーザーに初めての体験を提示すると便利なことがよくあります。これは、サインイン(状況に応じて必要な場合)、アプリケーションの使用方法の説明、アップデートの新機能の通知(Notes、Photos、Musicなど)のようないくつかの理由が考えられますiOS11)。
備考
第一に、複数のフローを扱う際に、ストーリーボードを効果的に使用できるのはこれです。デフォルトでは、アプリケーションはメインフローにMain.storyboard
を使用します。あなたのオンボーディング/代替フローは、セカンダリストーリーボードに含めることができます。 Onboarding.storyboard
これには多くの利点があります。
- 開発者のチームでは、各ユーザーフローの作業を分離することができます
- 明確なソース管理(git)
- 関心事の分離
アプリケーションが起動すると、どのフローを表示するかを決めることができます。これのロジックはAppDelegateに含めることができます:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
オンボーディングフローを表示するには、それを使用している人が旅行を完了し、作成しようとしているものに対して意味的に正しいものを一旦消してしまった経験をどのように処理したいのか検討する価値があります。
アプローチ:
2つの主なアプローチは次のとおりです。
- アプリケーションのメインウィンドウのルートビューコントローラを交換する
- メインフローとオーバーラップするモーダルの旅としてオンボーディングフローを提示します。
これの実装は、AppDelegateの拡張に含まれる必要があります。
オプション1:ルートビューコントローラのスワップ(正常)
トランジションオプションはUIViewAnimationOptions
でサポートされているものに限られますが、ルートビューコントローラの切り替えにはメリットがあります。 UIViewAnimationOptions
、フロー間の移行方法によっては、カスタムトランジションを実装する必要があり、煩雑になる可能性があります。
オンボーディングフローを表示するには、 UIApplication.shared.keyWindow.rootViewController
設定するだけです
解任は、 UIView.transition(with:)
を使用し、遷移スタイルをUIViewAnimationOptions
(この場合はCross Dissolve)として渡すことによって処理されます。 (フリップとカールもサポートされています)。
メインビューのフレームを設定する必要があります。メインビューのフレームは、初めてインスタンス化するときに変更する前に設定する必要があります。
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = UIApplication.shared.keyWindow, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.rootViewController = onboardingViewController
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow, let mainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() {
mainViewController.view.frame = window.bounds
UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {
window.rootViewController = mainViewController
}, completion: nil)
}
}
}
オプション2:代替的な流れをモーダルに提示する(より良い)
最も簡単な実装では、Onboardingフローは、意味的にユーザーが単一の旅にあるため、モーダルなコンテキストで単純に提示できます。
[Appleヒューマンインタフェースガイドライン - モダリティ] [1]:
誰かの注意を引くことが重要な場合、アプリケーションの使用を続けるためにタスクを完了または放棄する必要がある場合、または重要なデータを保存する場合にのみ、モーダルコンテキストを作成することを検討してください。
モーダルで提示することで、旅行の最後に単純なオプションの解雇が可能になり、スワップコントローラーの厄介さはほとんどありません。
カスタムトランジションは、 ViewController.present()
APIを使用するため、標準的な方法でもサポートされています。
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = window, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.makeKeyAndVisible()
window.rootViewController?.present(onboardingViewController, animated: false, completion: nil)
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow {
window.rootViewController?.dismiss(animated: true, completion: nil)
}
}
}