自定义转场可以分为push/pop、present/dismiss、UITabbarController三种,本文只描述前两种,并提供大体思路。
在视图控制器中自定义push/pop转场:
遵循导航代理:
self.navigationController.delegate = self;
添加代理:
<UINavigationControllerDelegate>
实现代理方法:
// 点击返回按钮,需实现:
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
// 若通过手机屏幕左侧向右滑动实现返回,需实现
- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController
第一个代理方法需要返回一个遵循UIViewControllerAnimatedTransitioning代理的对象:
@protocol UIViewControllerAnimatedTransitioning <NSObject>
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
@optional
- (id <UIViewImplicitlyAnimating>) interruptibleAnimatorForTransition:(id <UIViewControllerContextTransitioning>)transitionContext NS_AVAILABLE_IOS(10_0);
- (void)animationEnded:(BOOL) transitionCompleted;
@end
我们只需实现前两个代理方法,
第一个代理方法设置动画时间。
第二个代理方法设置具体实现动画内容。
对于interactionControllerForAnimationController代理方法,需要返回遵循UIViewControllerInteractiveTransitioning代理的对象,
我们可以直接创建遵循UIViewControllerInteractiveTransitioning代理对象实现,
也可以创建继承UIPercentDrivenInteractiveTransition的对象,
UIPercentDrivenInteractiveTransition是苹果对UIViewControllerInteractiveTransitioning代理的封装。
具体代码可以参考下面的Demo。
在视图控制器中自定义present/dismiss转场:
遵循过渡代理:
nextvc.modalPresentationStyle = UIModalPresentationCustom;
nextvc.transitioningDelegate = self;
添加代理:
<UIViewControllerTransitioningDelegate>
实现代理方法:
@protocol UIViewControllerTransitioningDelegate <NSObject>
@optional
// 动画present
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
// 动画dismiss
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
// 交互present
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
// 交互dismiss
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;
// 自定义弹窗管理
- (nullable UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(nullable UIViewController *)presenting sourceViewController:(UIViewController *)source NS_AVAILABLE_IOS(8_0);
@end
我们可以选择前四个方法中的多个方法进行实现,返回对象类型与自定义push/pop转场一致,所以实现也是一样的。
具体实现动画的代码,可以参考下面的两个Demo中的例子。
参考链接:
自定义present、dismiss 带交互
iOS自定义转场动画-无交互
Demo:
HHTransition
VCTransitionsLibrary
网友评论