iOS UIView动画

iOS 动画给人一种很流畅的感觉,提升用户体验,在APP开发过程中,我们只要利用好系统的动画,基本可以解决大部分的需求。

UIView动画实质上是Core Animation的封装,系统提供简洁的动画接口。

其中UIView动画可以设置的属性有:

  1. frame 大小
  2. bounds 拉伸
  3. center 中心位置
  4. transform 旋转
  5. alpha 透明度
  6. backgroundColor 背景色
  7. contentStretch 拉伸内容

UIView类动画

API
  /// 动画开始标记
  /// 第一个参数:动画标识
  /// 附加参数,在设置了代理的情况下,此参数将发送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法。大部分情况下,我们设置为nil即可。
  [UIView beginAnimations:(nullable NSString *)animationID context:(nullable void *)context]
  
  /// 动画持续时间
  [UIView setAnimationDuration:(NSTimeInterval)];
  /// 动画代理设置
  [UIView setAnimationDelegate:(nullable id)];
  ///  设置动画开始执行的回调SEL
  [UIView setAnimationWillStartSelector:(nullable SEL)];
  /// 设置动画执行结束的的回调SEL
  [UIView setAnimationDidStopSelector:(nullable SEL)];
  /// 设置动画延迟执行的时间
  [UIView setAnimationDelay:(NSTimeInterval)];
  /// 设置动画执行的重复次数
  [UIView setAnimationRepeatCount:(float)];
  /// 设置动画过渡曲线
  [UIView setAnimationCurve:(UIViewAnimationCurve)];

  UIViewAnimationCurve是一个枚举:
  UIViewAnimationCurveEaseInOut,         //缓入缓出 中间快
  UIViewAnimationCurveEaseIn,               // 由慢到快(缓入快出)
  UIViewAnimationCurveEaseOut,           // 由快到慢(快入缓出)
  UIViewAnimationCurveLinear,               // 匀速
  
  /// 设置是否从当前状态开始播放
  /// 假设上一个动画正在播放,且未播放完成, 我们将要执行新的动画.
  /// 当YES时,动画将从上一个动画所在的状态开始播放
  /// 当NO时,动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上结束)
  [UIView setAnimationBeginsFromCurrentState:YES];

  /// 动画是否继续执行相反的动画
  [UIView setAnimationRepeatAutoreverses:(BOOL)];

  /// 是否禁用动画效果(对象属性依然会该拜年,只是没有动画过渡效果)
  [UIView setAnimationsEnabled:(BOOL)];

  /// 设置视图过渡效果
  [UIView setAnimationTransition:(UIViewAnimationTransition) forView:(nonnull UIView *) cache:(BOOL)];

/*  
第一个参数: UIViewAnimationTransition,是一个枚举
    UIViewAnimationTransitionNone,                   // 不使用动画
    UIViewAnimationTransitionFlipFromLeft,      // 从左向右旋转翻页
    UIViewAnimationTransitionFlipFromRight,    // 从右向左旋转翻页
    UIViewAnimationTransitionCurlUp,                // 从下往上卷曲翻页
    UIViewAnimationTransitionCurlDown,           // 从上往下卷曲翻页

第二个参数:需要知心过渡动画的view
第三个参数:是否使用视图缓存,YES:视图在开始和结束时渲染一次,NO:视图在每一帧都渲染
*/

实例展示

  1. 改变属性frame
- (void)animation1{
    [UIView beginAnimations:@"FrameAnimation" context:@"232323"];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(startAnimation:context:)];
    [UIView setAnimationDidStopSelector:@selector(stopAnimation:)];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    self.giftView.frame = self.heartView.frame;
    [UIView commitAnimations];
}

//返回context参数
- (void)startAnimation:(NSString *)aniID context:(NSString *)context{
    
}

- (void)startAnimation:(NSString *)aniID{
    NSLog(@"%@",aniID);
}

- (void)stopAnimation:(NSString *)aniID{
    NSLog(@"%@",aniID);
}

效果图


asda.gif
  1. 转场效果动画
//转场动画
- (void)transitions{

   [UIView beginAnimations:@"FlipAni" context:nil];
   [UIView setAnimationDuration:1.0];
   [UIView setAnimationDelegate:self];
   [UIView setAnimationWillStartSelector:@selector(startAnimation:)];
   [UIView setAnimationDidStopSelector:@selector(stopAnimation:)];
   [UIView setAnimationRepeatCount:1];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.giftView cache:NO];
   self.giftView.image = [UIImage imageNamed:@"local_2"];
   [UIView commitAnimations];
}

效果图


asda.gif

UIView Block动画

  1. UIView BLock动画方法,都是比较常用的方法
[UIView animateWithDuration:(NSTimeInterval)  //动画持续时间
                                 animations:^{
                                //执行的动画
 }];

 [UIView animateWithDuration:(NSTimeInterval)  //动画持续时间
                  animations:^{
                //执行的动画
 }                completion:^(BOOL finished) {
                //动画执行完毕后的操作
 }];

 [UIView animateWithDuration:(NSTimeInterval) //动画持续时间
                       delay:(NSTimeInterval) //动画延迟执行的时间
                     options:(UIViewAnimationOptions) //动画的过渡效果
                  animations:^{
                   //执行的动画
 }                completion:^(BOOL finished) {
                   //动画执行完毕后的操作
 }];

我们详细说一下UIViewAnimationOptions这个枚举值,可以参考iOS动画中的枚举UIViewAnimationOptions

    UIViewAnimationOptionLayoutSubviews            //提交动画的时候布局子控件,表示子控件将和父控件一同动画。
    UIViewAnimationOptionAllowUserInteraction      //动画时允许用户交流,比如触摸
    UIViewAnimationOptionBeginFromCurrentState     //从当前状态开始动画
    UIViewAnimationOptionRepeat                    //动画无限重复
    UIViewAnimationOptionAutoreverse               //执行动画回路,前提是设置动画无限重复
    UIViewAnimationOptionOverrideInheritedDuration //忽略外层动画嵌套的执行时间
    UIViewAnimationOptionOverrideInheritedCurve    //忽略外层动画嵌套的时间变化曲线
    UIViewAnimationOptionAllowAnimatedContent      //通过改变属性和重绘实现动画效果,如果key没有提交动画将使用快照
    UIViewAnimationOptionShowHideTransitionViews   //用显隐的方式替代添加移除图层的动画效果
    UIViewAnimationOptionOverrideInheritedOptions  //忽略嵌套继承的选项

   //时间函数曲线相关
    UIViewAnimationOptionCurveEaseInOut            //时间曲线函数,缓入缓出,中间快
    UIViewAnimationOptionCurveEaseIn               //时间曲线函数,由慢到特别快(缓入快出)
    UIViewAnimationOptionCurveEaseOut              //时间曲线函数,由快到慢(快入缓出)
    UIViewAnimationOptionCurveLinear               //时间曲线函数,匀速

   //转场动画相关的
    UIViewAnimationOptionTransitionNone            //无转场动画
    UIViewAnimationOptionTransitionFlipFromLeft    //转场从左翻转
    UIViewAnimationOptionTransitionFlipFromRight   //转场从右翻转
    UIViewAnimationOptionTransitionCurlUp          //上卷转场
    UIViewAnimationOptionTransitionCurlDown        //下卷转场
    UIViewAnimationOptionTransitionCrossDissolve   //转场交叉消失
    UIViewAnimationOptionTransitionFlipFromTop     //转场从上翻转
    UIViewAnimationOptionTransitionFlipFromBottom  //转场从下翻转

  1. Spring Block Animation
    适用于所有可被添加动画效果的属性
 [UIView animateWithDuration:(NSTimeInterval)//动画持续时间
                       delay:(NSTimeInterval)//动画延迟执行的时间
      usingSpringWithDamping:(CGFloat)//阻尼系数,范围0~1,数值越小震动效果越明显
       initialSpringVelocity:(CGFloat)//初始速度,数值越大初始速度越快
                     options:(UIViewAnimationOptions)//动画的过渡效果
                  animations:^{
                     //执行的动画
 }
                  completion:^(BOOL finished) {
                     //动画执行完毕后的操作
 }];
  1. Keyframes动画
    iOS7新增关键帧动画,支持属性关键帧,不支持路径关键帧
 [UIView animateKeyframesWithDuration:(NSTimeInterval)//动画持续时间
                                delay:(NSTimeInterval)//动画延迟执行的时间
                              options:(UIViewKeyframeAnimationOptions)//动画的过渡效果
                           animations:^{
                         //执行的关键帧动画
 }
                           completion:^(BOOL finished) {
                         //动画执行完毕后的操作
 }];

UIViewKeyframeAnimationOptions枚举(可以组合使用):
UIViewAnimationOptionLayoutSubviews           //进行动画时布局子控件
UIViewAnimationOptionAllowUserInteraction     //进行动画时允许用户交互
UIViewAnimationOptionBeginFromCurrentState    //从当前状态开始动画
UIViewAnimationOptionRepeat                   //无限重复执行动画
UIViewAnimationOptionAutoreverse              //执行动画回路
UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置

UIViewKeyframeAnimationOptionCalculationModeLinear     //运算模式 :连续
UIViewKeyframeAnimationOptionCalculationModeDiscrete   //运算模式 :离散
UIViewKeyframeAnimationOptionCalculationModePaced      //运算模式 :均匀执行
UIViewKeyframeAnimationOptionCalculationModeCubic      //运算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced //运算模式 :平滑均匀

增加关键帧的方法:

 [UIView addKeyframeWithRelativeStartTime:(double)//动画开始的时间(占总时间的比例)
                         relativeDuration:(double) //动画持续时间(占总时间的比例)
                               animations:^{
                             //执行的动画
 }];
  1. 转场动画

4.1 从旧视图转到新视图的动画效果

 [UIView transitionFromView:(nonnull UIView *)
                     toView:(nonnull UIView *)
                   duration:(NSTimeInterval)
                    options:(UIViewAnimationOptions)
                 completion:^(BOOL finished) {
                     //动画执行完毕后的操作
 }];

在该动画执行过程中,fromView会从父视图移除,并将toView添加到父视图中,该转场动画作用对象是父视图。(也就是说过渡动画体现在父视图上面)

调用该方法相当于调用下面两个方法:

[fromView.superview addSubview:toView];
[fromView removeFromSuperview];

4.2 单个视图的过渡动画

 [UIView transitionWithView:(nonnull UIView *)  //动画作用的对象
                   duration:(NSTimeInterval)     //动画执行时间
                    options:(UIViewAnimationOptions)   //动画过渡效果
                 animations:^{
                 //执行的动画
 }
                 completion:^(BOOL finished) {
                 //动画执行完毕后的操作
 }];

示例演示

  1. 改变frame位置

- (void)blockAnimation1{
    [UIView animateWithDuration:1 animations:^{
        self.giftView.frame = self.heartView.frame;
    }completion:^(BOOL finished) {
        NSLog(@"执行完毕");
    }];
}


- (void)blockAnimation2{
    [UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.giftView.frame = self.heartView.frame;
    } completion:^(BOOL finished) {
        NSLog(@"执行完毕");
    }];
}
  

动画效果:


asda.gif
  1. 阻尼动画
- (void)blockAni1{
    [UIView animateWithDuration:1 delay:1 usingSpringWithDamping:0.5 initialSpringVelocity:5.0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.giftView.frame = self.heartView.frame;
    } completion:^(BOOL finished) {
        NSLog(@"执行结束");
    }];  
}

动画效果:

asda.gif
  1. Keyframes
    这里以颜色变化为例,演示关键帧动画
- (void)blockAni2{
    self.giftView.image = nil;
    
    [UIView animateKeyframesWithDuration:9.0 delay:0.f options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.9475 green:0.1921 blue:0.1746 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:1.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.1064 green:0.6052 blue:0.0334 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:2.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.1366 green:0.3017 blue:0.8411 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:3.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.giftView.backgroundColor = [UIColor colorWithRed:0.619 green:0.037 blue:0.6719 alpha:1.0];
        }];
    } completion:^(BOOL finished) {
        NSLog(@"动画结束");
    }];
    
}

动画效果


asda.gif
  1. 转场动画

4.1 单个视图的过渡效果

- (void)blockAni3{
    [UIView transitionWithView:self.giftView duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        self.giftView.image = [UIImage imageNamed:@"local_2"];
    } completion:^(BOOL finished) {
        NSLog(@"动画结束");
    }];
}

执行效果


asda.gif

将枚举值换为UIViewAnimationOptionTransitionFlipFromLeft的执行效果为:

asda.gif

4.2 从旧视图转到新视图的动画效果

//转场动画 从旧视图转到新视图的动画效果
- (void)blockAni4{
    UIImageView * newCenterShow = [[UIImageView alloc]initWithFrame:self.giftView.frame];
    newCenterShow.image = [UIImage imageNamed:@"local_2"];
    [UIView transitionFromView:self.giftView toView:newCenterShow duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
        NSLog(@"动画结束");
    }];
}

该动画作用的是父视图,动画效果如下:


asda.gif

本文文章以及代码,参考了iOS动画篇:UIView动画,所有代码和动画我都验证过,截图是我自己做的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • UIView动画简介 UIView动画实质上是对Core Animation的封装,提供简洁的动画接口。 UIVi...
    th先生阅读 193评论 0 0
  • 概述 在AppStore中的应用越来越重视动画效果的使用,一个良好动画效果可以让两个状态之间平滑地过度,也可以利用...
    蚊香酱阅读 5,448评论 3 58
  • UIView动画简介# UIView动画实质上是对Core Animation的封装,提供简洁的动画接口。 UIV...
    boundlessocean阅读 408评论 0 0
  • 花了将近一周的时间去学习ios动画,因为对于一个ios开发者来说,动画内容绝对是一门必修课。听了不少课,也看了不少...
    ChinaSwift阅读 1,906评论 2 35
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,041评论 0 4