サーチ…


前書き

あなたのアプリケーションの新しいユーザーに初めての体験を提示すると便利なことがよくあります。これは、サインイン(状況に応じて必要な場合)、アプリケーションの使用方法の説明、アップデートの新機能の通知(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つの主なアプローチは次のとおりです。

  1. アプリケーションのメインウィンドウのルートビューコントローラを交換する
  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)
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow