当前位置: 首页 > 编程笔记 >

IOS轻松几步实现自定义转场动画

杨乐意
2023-03-14
本文向大家介绍IOS轻松几步实现自定义转场动画,包括了IOS轻松几步实现自定义转场动画的使用技巧和注意事项,需要的朋友参考一下

一、系统提供的转场动画

目前,系统给我们提供了push/pops和present/dismiss两种控制器之间跳转方.当然,通过设置UIModalTransitionStyle属性,可以实现下面4种modal效果,相信大家都比较熟悉了,这里就不再展示效果图.

 UIModalTransitionStyleCoverVertical   // 从下往上,
 UIModalTransitionStyleFlipHorizontal  // 水平翻转
 UIModalTransitionStyleCrossDissolve   // 淡入淡出
 UIModalTransitionStylePartialCurl   // 卷角翻页

二、自定义转场动画使用场景

系统给我们提供的转场动画效果较少,并且有时想对系统的效果做一些修改.例如:我们使用淡入淡出的modal效果,系统的动画时间我们不满意,希望让动画快点,或者慢点.系统并没有给我提供直接修改的属性或者方法,那么,这时我们不得不考虑使用自定义转场动画来实现我们想要的效果.

三、自定义转场动画的实现步骤

第1步:设置需要弹出控制器的modalPresentationStyle为UIModalPresentationCustom

 detailVc.modalPresentationStyle = UIModalPresentationCustom;

第2步:设置转场代理

detailVc.transitioningDelegate = self

可以抽一个工具类,专门负责转场动画

第3步:遵守UIViewControllerTransitioningDelegate代理实现两个方法

确定谁负责弹出动画

-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
 self.isPresnted = YES;
 return self;
}

确定谁负责动画消失

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
 self.isPresnted = NO;
 return self;
}

第4步:实现转场动画

上面都返回self,说明当前控制器即负责弹出动画又负责动画消失,所以具体的转场动画在当前控制器中进行.

先确定转场动画时间间隔

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransithtml" target="_blank">ioning>)transitionContext {
 return 1.0;
}

再实现具体动画(由于当前控制器即负责弹出动画,又负责消失动画,所以定义一个Bool类型属性isPresnted加以区分)

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

 if (self.isPresnted == YES) {
  //这里做弹出动画

 } else {

 //这里做消失动画
 }
}

小结:

也可以让不同的控制器分别负责弹出和消失动画,这样就不需要定义一个专门用于区分的属性.个人建议最好是抽取一个专门负责转场动画的工具类,让该工具类负责所有转场动画,这样,不管是从业务逻辑上还是代码的复用性上都更加好.当然,这样做存在的一个弊端就是,转场动画中需要用到的一些属性必须通过定义变量,代理和Block等方式传递进来,而使用不同的控制器来管理弹出和消失动画在获取属性上更加方便.具体怎样做,也就仁者见仁,智者见智了.

下面来具体实现一个转场动画效果吧

由于实现动画的核心代码在第四步,这里也就只看animateTransition:这一个方法啦!

从上往下的Modal效果

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

 if (self.isPresnted == YES) {
  //1.取出view
  UIView *presentedView = [transitionContext viewForKey:UITransitionContextToViewKey];
  //2.放入containerView
  [[transitionContext containerView]addSubview:presentedView];
  //3.设置基本属性
  presentedView.frame = CGRectMake(0, -667, 375, 667);
  //4.动画
  [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
   presentedView.frame = CGRectMake(0, 0, 375, 667);
  }completion:^(BOOL finished) {
   [transitionContext completeTransition:YES];
  }];

 } else {
  //1.取出view
  UIView *dismissedView = [transitionContext viewForKey:UITransitionContextFromViewKey];
  //2.放入containerView
  [[transitionContext containerView]addSubview:dismissedView];

  //3.动画
  [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
   dismissedView.frame =CGRectMake(0, -667, 375, 667);
  }completion:^(BOOL finished) {

   [transitionContext completeTransition:YES];
  }];

 }
}


模仿系统淡入淡出效果

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

 if (self.isPresnted == YES) {
  //1.取出view
  UIView *presentedView = [transitionContext viewForKey:UITransitionContextToViewKey];
  //2.放入containerView
  [[transitionContext containerView]addSubview:presentedView];
  //3.设置基本属性
  presentedView.alpha = 0;
  //4.动画
  [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
   presentedView.alpha = 1.0;
  }completion:^(BOOL finished) {
   [transitionContext completeTransition:YES];

  }];

 } else {
  //1.取出view
  UIView *dismissedView = [transitionContext viewForKey:UITransitionContextFromViewKey];
  //2.放入containerView
  [[transitionContext containerView]addSubview:dismissedView];
  //3.设置基本属性
  dismissedView.alpha = 1;
  //4.动画
  [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
   dismissedView.alpha = 0;
  }completion:^(BOOL finished) {

   [transitionContext completeTransition:YES];
  }];
 }
}


动画的时间可以从ransitionDuration:方法获取

通过UITransitionContextToViewKey和UITransitionContextFromViewKey两个Key分别获取弹出和消失动画的View(注意别混淆两个Key)

要将做动画的View加入到专门用于动画的containerView中

总结

以上就是这篇文章的全部内容了,这里只介绍怎样实现转场动画,至于其他好玩NB的效果,大家可以自己试着实现,小编以后也会分享其他更好的效果,希望这篇文章对大家能有一定的帮助,如果有疑问大家可以留言交流。

 类似资料:
  • 本文向大家介绍轻松实现Android自定义九宫格图案解锁,包括了轻松实现Android自定义九宫格图案解锁的使用技巧和注意事项,需要的朋友参考一下 Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下: LockPatternView.java PointView.java MainActivity.java  效果图如下: 附上源码地址:https://github.com

  • 本文向大家介绍6步轻松实现两个listView联动效果,包括了6步轻松实现两个listView联动效果的使用技巧和注意事项,需要的朋友参考一下 看了网上更新的好多联动demo,感觉写的不是很简洁(表示不知道他们在说什么) 自己写了一个简单的Demo分享给大家- -! 效果图: 直接上车,少说废话! 所用到以下的这几个依赖,直接粘到Build.gradle文件中 1.定义首页的布局文件 2.Main

  • 本文向大家介绍iOS自定义View实现卡片滑动,包括了iOS自定义View实现卡片滑动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iOS自定义View实现卡片滑动效果的具体代码,供大家参考,具体内容如下 说明 控件基于UIView封装完成,采用UIPanGestureRecognizer监听自身的触摸事件,以此处理各种滑动动画操作。 内容之间可以循环切换,采用类似tableVie

  • 本文向大家介绍iOS轻松实现导航栏透明渐变,包括了iOS轻松实现导航栏透明渐变的使用技巧和注意事项,需要的朋友参考一下 首先我们来看下效果 一开始当我们什么只设置了一张图片作为它的头部视图的时候,它是这样的 1.首当其冲的,我们先得把导航栏弄透明 那么我们首先得知道,设置navigationBar的BackgroundColor为Clear是没用的,你可以试着设置它的clear,但是没用,原因一会

  • 本文向大家介绍Android自定义View实现自动转圈效果,包括了Android自定义View实现自动转圈效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现自动转圈效果展示的具体代码,供大家参考,具体内容如下 在values文件夹下创建attrs.xml 写一个类继承view 在主页面布局中引入自定义view类 以上就是本文的全部内容,希望对大家的学习有所帮助,也

  • 本文向大家介绍SpringBoot SSO轻松实现(附demo),包括了SpringBoot SSO轻松实现(附demo)的使用技巧和注意事项,需要的朋友参考一下 前言 网上SSO的框架很多,此篇文章使用的是自写的SSO来实现简单的登录授权功能,目的在于扩展性,权限这方面,自写扩展性会好点。 提示:以下是本篇文章正文内容,下面案例可供参考 一、技术介绍 1.SSO是什么? 单点登录(SingleS