DeepTransition 0.1.0

DeepTransition 0.1.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2014年12月
SPM支持 SPM

Ken Morishita 维护。



在 iOS 原生应用中,比如返回上一个画面很简单,但如果要过渡到 ViewController 阶层较远的画面,通常需要进行很多繁琐的处理。

还有其他情况,例如:

  • 从推送通知启动时,需要根据参数自动显示相应的页面。
  • 从 Web 或 WebView 的链接中,需要过渡到应用内的特定页面(即使目标层级较深)。
  • 在每次页面切换时记录 GoogleAnalytics 等信息。

这次提供的机制是为了更简单地实现这些功能。

用法

要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install

需求

  • 仅限 Swift

安装

规格

简单用法

  • 请为 Main Storyboard 的每个 ViewController 添加 Storyboard ID
  • 每个 ViewController 都应继承自 TransitionViewController
    • UITabBarController 应继承自 TransitionTabBarController
    • 如果无法从外部类继承,请参阅“无法继承 TransitionViewController 的情况”
  • 执行过渡时,请使用 transition.to("list_news!show(id=9)") 等方法
  • 请使用 RootTransitionAgent 指定初始 ViewController

RootTransitionAgent

要显示的初始 ViewController 应使用特别指定的 RootTransitionAgent(或其派生类)

RootTransitionAgent.create().forever().start("^/top")

然后在 AppDelegate 中添加如下代码即可显示。

过渡的写法

此处用 VC 表示 ViewController

示例

  • user, /user: 使用 NavigationController 的 Push 实现在当前 VC 中将页面切换到 user VC
  • !user: 使用 Modal(presentViewController)方式,展现当前的 user VC
  • ..: 返回上一级 VC
  • ../friend: 从上一层 VC 直接 Push 到 friend VC
  • ^/top: ^ 表示绝对 PATH,将根 VC 添加到 top VC
  • home#user: 从 home VC 深层内部的 user VC 进行切换

特殊过渡

  • up(n=1): 返回 n 个级别上方的 VC

符号

  • /: 使用 NavigationController 的 Push 进行过渡
  • !: 显示类似 ModalView 的视图
  • #: 类似于 Tab 的内部 ViewController
  • 参数:例如,传递给 /top/news(category=10,offset=50) 的参数,需要在括号中传递,并且可以通过 agent 的 params 方法进行引用。
  • !/: 在类似 ModalView 的显示中,包含 NavigationController 的容器

无法继承 TransitionViewController 的情况

TransitionViewController 的实现如下。请通过继承或扩展外部现有类来调用 viewDidShow() 方法。

public class TransitionViewController : UIViewController {
  override public func viewDidAppear(animated: Bool) {
    viewDidShow()
    super.viewDidAppear(animated)
  }
}

无法继承 TransitionTabBarController 的情况

TransitionTabBarController 的实现如下。请通过继承或扩展等方式实现。

public class TransitionTabBarController : UITabBarController {
  override public func viewDidAppear(animated: Bool) {
    setupAgentToInnerNameController()
    super.viewDidAppear(animated)
    viewDidShow()
    if (viewControllers?.count ?? 0) > selectedIndex {
      viewControllers?[selectedIndex].viewDidShow()
    }
  }
}

过渡通知

将过渡事件通知给 NSNotificationCenter。

  • TRANSITION_CENTER_EVENT_START Transcript:过渡开始
  • TRANSITION_CENTER_EVENT_END Transcript:过渡结束

自定义或详细实现注意事项

UIViewController 所要完成的工作

  • 一个 ViewController 被主 Storyboard 的 Storyboard ID 识别。此类行为可以通过实现后续提到的 decideViewController 方法进行更改。
  • 其层级可以指定为类似 '/top/list_news/show_news' 的形式。在这种情况下,ViewController 按顺序连接:top -> list_news -> show_news。
  • 进行页面过渡时,请执行 transition.to("/top/list_news") 等操作。
  • 如果有添加 ViewController 的过渡,则必须执行此操作。
  • 但是,Back(移除 ViewController)等操作可以通过其他方法(NavigationController 自动提供的方法)进行,也无妨。
  • 当覆盖 viewDidAppear 时,请一定调用 super(忘记调用会导致后续无法进行过渡)。

UITabBarController 内的 ViewController

当在 UITabBarController 中处理多个 ViewController 时,请在 Framework 侧不生成 VC,而由 UITabBarController 等进行(这应该是正常操作)。通过定义 controllerName:String 这类属性,以便 Framework 侧可以找到(Storyboard ID 无法查找)。

请参阅 Example 的 ProfileViewController.swift 等。

在UITabBarController 内配置新的 UINavigationController 时的注意事项

UITabBarController 内的 UINavigationController 似乎不会调用其管理下的 VC 的 viewDidAppear 等方法。

例如,FriendListViewController.swift

实现 UINavigationControllerDelegate 并执行如下操作:

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
  viewController.viewDidAppear(animated)
}

进行调用。

实现 TransitionAgentDelegate 的 Method 时

要自定义过渡行为时,请实现以下操作。

  • decideViewController:返回实现了 Transition ViewControllerProtocol 的 UIViewController。如果不需要过渡,则返回 nil。
  • showViewController,showModelViewController,showInternalViewController:可以自定义 ViewController 的显示动画等。在那里,可以自由地显示 ViewController,但务必将其添加到 ViewController 阶层中。
  • → 使用 navigateToViewController、presentViewController 或 addChildViewController 等操作

在 TransitionViewControllerProtocol 的各个 Method 中完成的操作

在实现独特的 TransitionViewControllerProtocol 时,请注意以下事项。请参考 TransitionViewController 和 TransitionDefaultHandler 的实现。

addViewController

  • 创建 ViewController
  • 为创建的 ViewController 提供正确的 Path 以进行安装
  • 务必将其添加到 ViewController 阶层中。
  • 在 Center 中通知 viewDidAppear 事件 (调用 transitionCenter.reportViewDidAppear)。基本上,在 UIViewController 的事件 viewDidAppear 内进行。

setupAgent

  • 使用正确的 Path 创建 Agent 并设置所需的 Delegate。

removeViewController

  • 隐藏并删除子 ViewController,并调用 transitionCenter.reportFinishedRemoveViewControllerFrom。

作者

Ken Morishita, [email protected]

许可

DeepTransition遵循MIT许可。有关更多信息,请参阅LICENSE文件。