Szukaj…


Wprowadzenie

Często przydatne jest zaprezentowanie pierwszego uruchomienia nowym użytkownikom aplikacji. Może to być z wielu powodów, takich jak monitowanie ich o zalogowanie się (jeśli jest to wymagane w danej sytuacji), wyjaśnianie, jak korzystać z aplikacji lub po prostu informowanie ich o nowych funkcjach w aktualizacji (tak jak robią to Notatki, Zdjęcia i Muzyka) iOS11).

Uwagi

Po pierwsze, ponieważ masz do czynienia z wieloma przepływami, tutaj możesz skutecznie używać Storyboardów. Domyślnie Twoja aplikacja używa Main.storyboard do głównego przepływu. Twój onboarding / alternatywny przepływ może być zawarty w dodatkowej serii ujęć, np. Onboarding.storyboard

Ma to wiele zalet:

  • w zespole programistów prace nad każdym przepływem użytkowników można rozdzielić
  • wyraźniejsza kontrola źródła (git)
  • rozdzielenie obaw

Po uruchomieniu aplikacji możesz określić, który przepływ powinien zostać przedstawiony. Logika tego może być zawarta w AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let isFirstRun = true // logic to determine goes here
    if isFirstRun {
        showOnboarding()
    }
    return true
}

Aby pokazać przebieg wdrażania, warto zastanowić się, w jaki sposób chciałbyś poradzić sobie z doświadczeniem zwalniania go, gdy osoba go wykorzystująca zakończy podróż, i które jest semantycznie poprawne do tego, co próbujesz stworzyć.

Podejścia:

Dwa główne podejścia to:

  1. Zamień kontroler widoku głównego w głównym oknie aplikacji
  2. Przedstaw przepływ Onboarding jako modalną podróż, pokrywającą się z przepływem głównym.

Implementacja tego powinna być zawarta w rozszerzeniu AppDelegate.

Opcja 1: Zamień kontroler widoku głównego (Dobrze)

Przełączanie kontrolera widoku głównego ma zalety, chociaż opcje przejścia są ograniczone do tych obsługiwanych przez UIViewAnimationOptions , więc w zależności od tego, w jaki sposób chcesz przechodzić między przepływami, może to oznaczać konieczność implementacji niestandardowego przejścia - co może być kłopotliwe.

Możesz pokazać przepływ dołączania, po prostu ustawiając UIApplication.shared.keyWindow.rootViewController

Zwolnienie jest obsługiwane przez użycie UIView.transition(with:) i przekazanie stylu przejścia jako UIViewAnimationOptions , w tym przypadku Cross Dissolve. (Obsługiwane są również przewrotki i loki).

Musisz także ustawić ramkę widoku głównego przed powrotem do niego, gdy tworzysz go po raz pierwszy.

// 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)
        }
    }
}

Opcja 2: Prezentuj przepływ alternatywny modalnie (lepiej)

W najprostszej implementacji przepływ Onboarding można po prostu przedstawić w kontekście modalnym, ponieważ semantycznie użytkownik jest w jednej podróży.

[Wytyczne Apple Human Interface Interface - modalność] [1]:

Rozważ utworzenie kontekstu modalnego tylko wtedy, gdy jest to bardzo ważne, aby zwrócić na siebie uwagę, gdy zadanie musi zostać zakończone lub porzucone, aby kontynuować korzystanie z aplikacji lub zapisać ważne dane.

Prezentacja modalna pozwala na prostą opcję zwolnienia na koniec podróży, przy niewielkim nakładzie wymiany kontrolerów.

Niestandardowe przejścia są również obsługiwane w standardowy sposób, ponieważ korzysta z interfejsu API ViewController.present() :

// 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow