为自定义 iOS 视图控制器转换提供统一、简单的 API。
也许您观看过 2013 WWDC 演讲 或阅读了有关如何使用自定义转换在子视图控制器之间、模态视图控制器以及在导航控制器中的一些稍分散的 文档。在几分钟之后,您已经在 Protocolandia 漫无目的地徘徊。我们并不责怪您。
pod 'STPTransitions'
(通过 CocoaPods)
正在开发中
首先导入库的头文件
#import <STPTransitions.h>
使用 STPBlockTransition
,您可以快速创建行内转换
STPTransition *snazzyTransition = [STPTransition transitionWithAnimation:
^(UIView *fromView,
UIView *toView,
UIView *containerView,
void (^executeOnCompletion)(BOOL finished)) {
// Your fabulous animations go here
}];
注意:您有两个重要的责任
fromView
是 containerView
的子视图,toView
不是。在适当的时候添加它。executeOnCompletion
(在其完成块的最后)。设置时,将 STPTransitionCenter
单例分配为导航控制器的代理
navigationController.delegate = [STPTransitionCenter sharedInstance];
现在只需使用以下代码推送和弹出视图控制器即可
[self.navigationController pushViewController:viewController
usingTransition:snazzyTransition];
// and
[self.navigationController popViewControllerUsingTransition:transition];
不需要设置。在父控制器中,使用以下代码在两个子控制器之间切换:
[self transitionFromViewController:oldChildViewController
toViewController:newChildViewController
usingTransition:snazzyTransition];
注意:这种转换目前无法进行交互。如果您想使用此功能,请在 Issues 中表达您的意见。
要设置,将单例STPTransitionCenter
分配给呈现控制器代理
self.transitioningDelegate = [STPTransitionCenter sharedInstance];
现在只需使用以下代码呈现和 dismiss 视图控制器
[self presentViewController:viewController
usingTransition:snazzyTransition
completion:completion];
// and
[self dismissViewControllerUsingTransition:snazzyTransition
completion:(void (^)(void))completion];
为了保持视图控制器薄和代码库的合理分离,你可能不会想在视图控制器中保留过渡动画代码。这也允许过渡的可重用性。通过继承STPTransition
,你就能实现这两个目标。
请参阅示例项目进行实际代码示例。
当推送或呈现一个视图控制器时,你可以指定当返回操作(即弹出或 dismiss)发生时应使用哪个过渡。为此,只需将过渡对象分配给reverseTransition
。
这大大帮助了解耦,因为在已推送呈现的控制器中不需要知道它如何被显示。
提示:只需将reverseTransition
分配为新创建的类的一个新实例,就像你为推送/present创建的类一样。下面说明了如何在同一个类中轻松处理两种动画。
截至 iOS 7.0.2,在横向模式下自定义模态过渡不可用,因为 iOS 给你的视图有许多损坏的框架和转换。STPTransitions试图为你解决这个问题,提供你期望方向的视图。这已经在 iPad 全屏横向自定义模态中进行了测试,并且有效。
通常,你不想为同一类型的动画创建两个STPTransition
子类,即一个用于前进,一个用于回退。当回退(即弹出或 dismiss 控制器)时,过渡实例会自动分配给isReversed
的YES
。
提示:代码重用,在同一类中处理正向和反向过渡。通常这意味着在isReversed
上使用if/else
条件。
一个过渡可以被分配一个手势识别器。当识别器检测到手势时,过渡就会自动启动。
注意:《this》并不意味着过度(例如,会跟随用户的指尖)是交互式的,尽管它可以。
待办:交互式过渡尚不支持。
interactive
属性设置为YES
。gestureRecognizer
,它将跟踪进度。interactiveGesturePercentageCompletionForPoint:
。注意:交互式过渡不一定是通过交互触发的,例如,可以通过按钮触发并发生非交互式过渡。《wasTriggeredInteractively属性会告知触发方式。
如果您希望库默认包含一些可配置的常用转换,请在Issues中发表您的意见。也欢迎贡献。
问题:我需要让我的 UINavigationController
有自己的代理。我该做什么?
答案:从 STPTransitionCenter
继承您的代理,并使用您自己的实例而不是默认中心。由于您没有使用单例,因此您负责保持该对象存在。确保在任何由中心实现的代理方法中调用 super
。
由 Stepan Hruda 创建。如果您关注他在Twitter上的动态,他会过得很好。
感谢 Josh Vickery 和 ShopKeep POS 的贡献和反馈。
在 MIT 许可证 下发布。