首先,当您处理多个流程时,这就是故事板可以有效使用的地方。默认情况下,您的应用程序使用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
}
为了显示入职流程,值得考虑的是,一旦使用它的人完成了旅程,您希望如何处理关闭它的体验,并且这在语义上对于您尝试创建的内容来说是正确的。
方法:
两种主要方法是:
- 交换应用程序主窗口的根视图控制器
- 将入职流程呈现为模态旅程,与主流程重叠。
其实现应包含在 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)
}
}
}