TransitionCoordinator
安装
TransitionCoordinator可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'TransitionCoordinator'
概述
TransitionCoordinator旨在简化iOS应用中自定义视图控制器过渡的处理。
它具有哪些功能?
- 处理在
UINavigationController
栈上对UIViewController
的推送/弹出。 - 处理以模态方式显示/消失
UIViewController
。 - 允许每个过渡使用不同的
TransitionAnimator
。因此,可以将具有不同过渡的一串视图控制器推送到导航栈中。 - 允许每个过渡指定其退回按钮的图片和/或文本。
- 自带一些基本过渡。
- 结构简单,易于添加和使用自定义过渡。
- 支持通过编程和
UIStoryboardSegue
执行视图控制器过渡。
它如何工作
这个库由三部分组成。分别是 TransitionCoordinator
、TransitionAnimator
和 TransitionPresentationController
。
TransitionCoordinator
TransitionCoordinator单例提供了方便的函数,可用来自定义在推送或显示视图控制器时的动画。
在开始过渡之前,过渡协调器将要求视图控制器提供它的TransitionAnimator
(如果是模态显示,还需要提供TransitionPresentationController
),它将用于实际的过渡动画。这既适用于过渡到下一个视图控制器,也适用于过渡到上一个视图控制器。
由于每个视图控制器都定义了自己的过渡,因此每个视图控制器都可以带有独特的过渡效果加入到导航堆栈中。例如,可以将视图控制器逐个以如‘radial’ -> ‘vertical’ -> ‘fade’这样的过渡效果推入导航堆栈。当视图控制器从导航堆栈中移除时,它们将会以‘fade’ -> ‘vertical’ -> ‘radial’这样的顺序动画移除。
TransitionAnimator
TransitionAnimator
决定了如何对过渡进行动画处理。你可以创建自己的子类来自定义动画,或者使用提供的类。
TransitionAnimator
是描述实际动画的组件。例如,垂直动画或径向擦除动画。它可以初始化为一个可选的navigationBackImage
和一个可选的navigationBackTitle
。这使得每个被显示的视图控制器都可以定义自己的返回按钮和返回按钮标题。这是一个有用的功能,因为它允许你根据自己的喜好来决定是使用标准的水平方式还是垂直方式推送导航控制器中的视图控制器,这样'返回'按钮可能就不那么合适了,显示一个'向上'按钮来弹出可能会更合适。
TransitionAnimator
遵循UIViewControllerAnimatedTransitioning
协议并实现了以下功能
public func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval
public func animateTransition(transitionContext: UIViewControllerContextTransitioning)
这允许你定义动画的持续时间和实际动画本身。要创建自己的动画,你应该从TransitionAnimator
派生一个子类并实现这些函数。有关过渡动画器的示例,请参阅附带的项目。
过渡展示控制器
TransitionPresentationController
是UIPresentationController
的子类,为展示的视图控制器提供高级视图和过渡管理。如果您正在将视图控制器推送到导航堆栈中,则不需要TransitionPresentationController
。它仅用于展示视图控制器。
在展示视图控制器时应使用TransitionPresentationController
,并定义该视图控制器如何展示。您可以创建自己的子类来定义特定的样式,或使用提供的类之一。过渡展示控制器是可选的,如果没有提供,将默认显示全屏模态。
使用
推送视图控制器
在将UIViewController
推送到UINavigationController
的堆栈时,视图控制器必须遵守TransitionCoordinatorPushableViewController
协议。这确保视图控制器定义了自己的TransitionAnimator
(协调器在执行过渡时将请求它)。
以代码方式执行推送过渡
guard let navigationController = self.navigationController else { return }
let viewController = PushableViewController()
TransitionCoordinator.sharedCoordinator.setPushTransitionAnimator(TransitionAnimatorTopToBottom(),
forViewController: viewController,
withNavigationController: navigationController)
navigationController.pushViewController(viewController, animated: true)
注意,在将视图控制器推送之前,必须调用TransitionCoordinator
。
通过StoryboardSegue执行推送过渡
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
guard let navigationController = self.navigationController else { return }
TransitionCoordinator.sharedCoordinator.setPushTransitionAnimator(TransitionAnimatorTopToBottom(),
forViewController: segue.destination,
withNavigationController: navigationController)
}
呈现视图控制器
当模态地呈现一个 UIViewController
时,该视图控制器必须遵循 TransitionCoordinatorPresentableViewController
协议。这确保视图控制器定义了自己的 TransitionAnimator
和 TransitionPresentationController
(当协调器将要执行转换时,它会请求这些内容)。
以编程方式执行呈现转换
let viewController = PresentableViewController()
let navigationController = UINavigationController(rootViewController: viewController)
TransitionCoordinator.sharedCoordinator.setPresentTransitionAnimator(TransitionAnimatorTopToBottom(),
forViewController: navigationController)
self.present(navigationController, animated: true, completion: nil)
通过 UIStoryboardSegue 执行呈现转换
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
TransitionCoordinator.sharedCoordinator.setPresentTransitionAnimator(TransitionAnimatorTopToBottom(),
forViewController: segue.destination)
}
示例
要运行示例项目,请首先克隆仓库,然后从 Example 目录运行 pod install
。
要求
- iOS 9.3+
- Swift
作者
Simon McFarlane, [email alias="[email protected]" dataηρευςύψItemClick="CFEmail"]
许可证
TransitionCoordinator符合MIT许可证。有关更多信息,请参阅LICENSE文件。