iOS平滑式特点的过场动画实现

本文介绍了一种自定义iOS转场动画的方法,通过封装单例模式基类MBTransition,并重写核心代理方法来实现不同类型的过渡动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前看到一些打车软件的界面,发现这些界面的滑动不是很硬的切换,而是很平滑的就滑动过来了,所以,自己调研了一下,找了一些资料,把功能实现了,把步骤的大概和大家分享一下.


分析

首先,我封装了一个单例模式MBTransition基类,使用单例模式的原因有两个:

  1. 在一个App中,同时存在的过场只会有一个。
  2. 实现成单例之后过场对象就不需要依赖于某个UIViewController。
Push/Pop时自定义过场的代理

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { returnself;//返回self表示代理由类本身实现}


Present时自定义过场的代理

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source{ returnself;}


Dismiss时自定义过场的代理

-(id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{ returnself;}


实现具体自定义过场动画效果的代理,这个代理也是实现动画效果的核心

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{}


过场动画时间的代理

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{returnself.duration;}

通过上面几个代理我们可以知道:Push/Pop和Present时过场动画的代理是不一样的

接下来分析一下 (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 代理

1.通过 transitionContext 获取到过场时切换的两个UIViewController

2.通过 transitionContext 获取到执行切换的UIView

3.通过 transitionContext 获取到过场的持续时间

4.最后通过 transitionContext 获取到过场时切换的 fromVC 和 toVC 和Push/Present时保存的 fromVC 和 toVC 进行比较就可以知道目前执行的是Push/Present还是Pop/Dismiss,从而可以为Push/Present和Pop/Dismiss定制不同的动画效果

5.接下来就是具体的过场动画部分了,其实就是结合fromVC的view、toVC的view和container做一些动画效果

特点

  1. 如果要实现其他自定义过场,只需要继承MBTransition,然后重写(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 代理即可。
  2. 使用者只需调用一个接口即可实现自定义过场,降低了代码耦合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值