Swift:呈现主要和替代(登录/入门)流程时出现视觉故障? [关闭]

2023-12-19

我有一个应用程序需要用户登录或创建帐户第一次启动应用程序时。 (虽然一般不建议这样做,但这是一个非常具体的用例。)

此外,如果他们已经登录,当应用程序更新时我想向他们展示一个屏幕,告诉他们新功能(就像 iOS12 中的笔记、照片和音乐一样)。

我遇到的问题是,当更改 AppDelegate 中“window”的“rootViewController”时,应用程序会出现故障,在载入视图控制器变得可见之前,我可以瞬间看到主视图控制器。

有办法避免这种情况吗?这个逻辑可以封装在ViewControllers或者AppDelegate中吗?

是否有一种机制可以用于一个或多个不依赖于多个实现的场景?


首先,当您处理多个流程时,这就是故事板可以有效使用的地方。默认情况下,您的应用程序使用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
}

为了显示入职流程,值得考虑的是,一旦使用它的人完成了旅程,您希望如何处理关闭它的体验,并且这在语义上对于您尝试创建的内容来说是正确的。

方法:

两种主要方法是:

  1. 交换应用程序主窗口的根视图控制器
  2. 将入职流程呈现为模态旅程,与主流程重叠。

其实现应包含在 AppDelegate 的扩展中。

选项 1:交换根视图控制器(好)


切换根视图控制器有很多好处,尽管转换选项仅限于UIViewAnimationOptions,因此取决于您希望如何在流程之间转换,可能意味着您必须实现自定义转换 - 这可能很麻烦。

您只需设置即可显示入职流程UIApplication.shared.keyWindow.rootViewController

解雇是通过利用UIView.transition(with:)并将过渡样式传递为UIViewAnimationOptions,在本例中为交叉溶解。 (还支持翻转和卷曲)。

当您第一次实例化它时,您还必须在转换回主视图之前设置主视图的框架。

// 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:模态地呈现替代流程(更好)


在最简单的实现中,入职流程可以简单地在模态上下文中呈现,因为从语义上讲,用户处于单一旅程中。

Apple 人机界面指南 – 形态 https://developer.apple.com/ios/human-interface-guidelines/interaction/modality/:

仅当需要引起某人的注意、必须完成或放弃任务才能继续使用应用程序或保存重要数据时,才考虑创建模态上下文。

模态呈现允许在旅程结束时简单地选择解雇,几乎不需要交换控制器。

标准方式也支持自定义过渡,因为这使用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)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:呈现主要和替代(登录/入门)流程时出现视觉故障? [关闭] 的相关文章

随机推荐