轻量级API,用于构建UIViewController切换。
此库标准化了iOS上构建切换的方式,因此使用一行代码即可选择想要使用的自定义切换
let viewController = MyViewController()
viewController.transitionController.transition = CustomTransition()
present(modalViewController, animated: true)
MyViewController *viewController = [[MyViewController alloc] init];
viewController.mdm_transitionController.transition = [[CustomTransition alloc] init];
[self presentViewController:viewController animated:true completion:nil];
使用此库制作切换的最简单方法是创建一个符合Transition
协议的类
final class CustomTransition: NSObject, Transition {
func start(with context: TransitionContext) {
CATransaction.begin()
CATransaction.setCompletionBlock {
context.transitionDidEnd()
}
// Add animations...
CATransaction.commit()
}
}
@interface CustomTransition: NSObject <MDMTransition>
@end
@implementation CustomTransition
- (void)startWithContext:(id<MDMTransitionContext>)context {
[CATransaction begin];
[CATransaction setCompletionBlock:^{
[context transitionDidEnd];
}];
// Add animations...
[CATransaction commit];
}
@end
导入框架
@import Transitioning;
您现在将能够访问所有API。
通过运行以下命令,检查rep的本地副本以访问Catalog应用程序
git clone https://github.com/material-motion/transitioning-objc.git
cd transitioning-objc
pod install
open Transitioning.xcworkspace
背景:iOS中,通过在视图控制器上设置一个
transitioningDelegate
来自定义切换。当一个视图控制器被展示时,UIKit将要求切换代理提供一个动画、交互和展示控制器。这些控制器随后将期望实现切换的运动。
切换在这些协议之上提供了一个薄层,具有以下优点
TransitionWith*
协议,切换对象可以自定义其行为。这种面向协议的设计比协议上的许多可选方法更符合Swift。在本指南中,我们将创建一个简单切换的脚手架。
过渡必须是指定NSObject
类型,并且符合Transition
协议。
我们预期需要实现的唯一方法是start
,它会在视图控制器每次显示或消失时被调用。
final class FadeTransition: NSObject, Transition {
func start(with context: TransitionContext) {
}
}
如果显式使用Core Animation
final class FadeTransition: NSObject, Transition {
func start(with context: TransitionContext) {
CATransaction.begin()
CATransaction.setCompletionBlock {
context.transitionDidEnd()
}
// Your motion...
CATransaction.commit()
}
}
如果使用UIView隐式动画
final class FadeTransition: NSObject, Transition {
func start(with context: TransitionContext) {
UIView.animate(withDuration: context.duration, animations: {
// Your motion...
}, completion: { didComplete in
context.transitionDidEnd()
})
}
}
有了基本支架,你现在可以来实现你的动画了。
当你需要执行以下操作时,你可以自定义过渡的展示:
你必须继承UIPresentationController以实现自定义行为。如果你的过渡使用者的任何展示行为都可以自定义,你将想要定义一个自定义初始化器。
注意:避免在展示控制器中存储过渡上下文。展示控制器会一直存活,直到其关联的视图控制器被销毁,而过渡上下文只在过渡活跃期间才有效。每个展示和消失都会有自己的唯一的过渡上下文。如果在展示控制器中存储上下文,上下文的存在时间会比它原本设置的要长。
重写你的动作用到的任何UIPresentationController
方法。
final class MyPresentationController: UIPresentationController {
}
TransitionWithPresentation
这确保了你的过渡实现了需要的展示方法。
只有当你从defaultModalPresentationStyle
方法返回.custom
以及从presentationController
方法返回非空UIPresentationController
子类时,展示才会被自定义。
extension VerticalSheetTransition: TransitionWithPresentation {
func defaultModalPresentationStyle() -> UIModalPresentationStyle {
return .custom
}
func presentationController(forPresented presented: UIViewController,
presenting: UIViewController,
source: UIViewController?) -> UIPresentationController? {
return MyPresentationController(presentedViewController: presented, presenting: presenting)
}
}
如果你的展示控制器需要动画,你可以实现Transition
协议,以便在每次过渡开始时收到一个start
调用。展示控制器的start
会在过渡的start
之前被调用。
注意:你的展示控制器和你的过渡可能有不同的想法,关于过渡何时完成,所以考虑哪个对象应该负责调用
transitionDidEnd
。通常,调用这个方法的对象是过渡对象本身。
extension MyPresentationController: Transition {
func start(with context: TransitionContext) {
// Your motion...
}
}
我们欢迎贡献!
查看我们的即将到来的里程碑。
基于Apache 2.0许可证。详细信息请参阅LICENSE。