iOS动画(二)----UIView动画之源码实现

工欲善其事,必先利其器。上篇简略介绍了UIViewAnimate的基本方法和特效枚举:
iOS动画(一)----UIView动画之api认识
本章介绍一些动画的简单实现。
一、从几个维度介绍UIView基本动画

- (UIImageView *)animateIV {
    if (!_animateIV) {
          _animateIV = [[UIImageView alloc] initWithFrame:CGRectMake(50, NavBarHeight+50, 100, 100)];
          _animateIV.image = [UIImage imageNamed:@"image_0"];
     }
     return _animateIV;
}

<一>、基于坐标尺寸变化的动画,主要有三个点:
1、 bounds:修改这个属性会结合center属性重新计算frame,建议通过这个属性修改尺寸。
2、frame:修改这个属性通常会导致视图形变的同时也发生移动,然后会重新设置center跟bounds属性。
3、center: 设置后视图会移动到一个新位置,修改后会结合bounds重新计算frame。


坐标尺寸.gif
/** 只改尺寸变化  */
- (void)boundsAnimation {
    /*
     *参数:动画时长
     *回调一:动画结束后,视图到达状态
     *回调二:动画执行完毕
     */
    [UIView animateWithDuration:0.3f animations:^{
        self.animateIV.bounds = CGRectMake(0, 0, 50, 50);
    } completion:^(BOOL finished) {
        self.animateIV.bounds = CGRectMake(0, 0, 100, 100);
    }];
}
/** 位置尺寸均变化  */
- (void)frameAnimation {
    [UIView animateWithDuration:0.3f animations:^{
        self.animateIV.frame = CGRectMake(200, NavBarHeight, 50, 50);
    } completion:^(BOOL finished) {
        self.animateIV.frame = CGRectMake(50, NavBarHeight+50, 100, 100);
    }];
}

/** 中心点变化 */
- (void)centerAnimation {
    [UIView animateWithDuration:0.3f animations:^{
        self.animateIV.center = CGPointMake(150, NavBarHeight+50+ 100);
    }];
}

<二>、基于视图显示的动画,主要有两个点:
1、backgroundColor: 修改这个属性会产生颜色渐变过渡的效果,本质上是系统不断修改了tintColor来实现的。
2、alpha:修改这个属性会产生淡入淡出的效果。


视图显示.gif
/** 背景色变化 */
- (void)backgroundAnimation {
    [UIView animateWithDuration:1.0f  animations:^{
        self.animateIV.backgroundColor = [UIColor purpleColor];
    } completion:^(BOOL finished) {
        self.animateIV.backgroundColor = [UIColor redColor];
    }];
}

/** 透明度变化 */
- (void)alphaAnimation {
    [UIView animateWithDuration:0.3f animations:^{
        self.animateIV.alpha = 0.3f;
    } completion:^(BOOL finished) {
        self.animateIV.alpha = 1.0f;
    }];
}

<三>、形态变换动画,即线性代数上的矩阵变化(后期核心动画再作说明),一个点:
transform:修改这个属性可以实现旋转、形变、移动、翻转等动画效果,其通过矩阵运算的方式来实现,因此更加强大


形态变换.gif
/** 向上平移 */
- (void)transformMoveUpAnimate {
    [UIView animateWithDuration:0.5 animations:^{
        // 使用Make,它是相对于最原始的位置做的形变,开发中,不用这个,只能移动一次,
        // 看见有Make,就只能移动一次,
        // self.animateIV.transform = CGAffineTransformMakeTranslation(0, -20);
        // 相对于上一次做形变,开发中经常使用下面的
        self.animateIV.transform = CGAffineTransformTranslate(self.animateIV.transform, 0, -20);
    }];
}
/** 向下平移 */
- (void)transformMoveDownAnimate {
    [UIView animateWithDuration:0.5 animations:^{
        //使用Make,它是相对于最原始的位置做的形变.
        //self.animateIV.transform = CGAffineTransformMakeTranslation(0, 20);
        //相对于上一次做形变.
        self.animateIV.transform = CGAffineTransformTranslate(self.animateIV.transform, 0, 20);
    }];
}
/** 旋转 */
- (void)transformSlideAnimate {
    [UIView animateWithDuration:0.5 animations:^{
        //旋转的度数, 是一个弧度
        //使用Make,它是相对于最原始的位置做的形变.
        //self.animateIV.transform = CGAffineTransformMakeRotation(M_PI_4);
        self.animateIV.transform = CGAffineTransformRotate(self.animateIV.transform, M_PI_4);
    }];
}
/** 缩放 */
- (void)transformScaleAnimate {
    [UIView animateWithDuration:0.5 animations:^{
        //使用Make,它是相对于最原始的位置做的形变.
        //self.animateIV.transform = CGAffineTransformMakeScale(0.8, 0.8);
        self.animateIV.transform = CGAffineTransformScale(self.animateIV.transform, 0.8, 0.8);
    }];
}

二、UIView的关键帧动画
即给需要动画效果的属性,准备一组与时间相关的值,这些值都是在动画序列中比较关键的帧中提取出来的,而其他时间帧中的值,可以用这些关键值,采用特定的插值方法计算得到,从而达到比较流畅的动画效果。


关键帧.gif
- (void)clickAciton:(UIButton *)sender {
    UIView *startView = [[UIView alloc] initWithFrame:CGRectMake(0, NavBarHeight, 60, 60)];
    //startView.center = CGPointMake(30, NavBarHeight+30);
    startView.backgroundColor = randomColor;
    startView.layer.cornerRadius = 30;
    startView.layer.borderWidth = 5;
    startView.layer.borderColor = randomColor.CGColor;
    [self.view addSubview:startView];

   /**创建一个关键帧动画
     *参数1:动画时长8秒
     *参数2:动画延时0面
     *动画效果:线性 + 重复
     */
    [UIView animateKeyframesWithDuration:8 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeLinear | UIViewAnimationOptionRepeat animations:^{
        //设计竖直方向6个位置
        CGFloat averageHeight = (Main_Screen_Height-NavBarHeight-TabBarSafeHeight-30-30)/5.0;
        for (NSInteger i=0; i<6; i++) {
            /*插入关键帧动画信息
             *参数1:表示关键帧动画开始的时刻在整个动画中的百分比
             *参数2:表示这个关键帧动画占用整个动画时长的百分比
             */
            [UIView addKeyframeWithRelativeStartTime:i/6.0 relativeDuration:1/6.0 animations:^{
                startView.center = CGPointMake(i%2==0 ? 30 : Main_Screen_Width-30 , averageHeight*i + NavBarHeight+30);
            }];
        }
    } completion:^(BOOL finished) {
    }];
}

三、UIViewAnimationOptions其中的几种动画效果


转场及阻尼.gif
/*** 转场动画 **/
 #pragma mark - Methods
- (void)makeTransitionType:(UIViewAnimationOptions)animationTransitionType {
  if ([[self.baseView subviews] containsObject:self.bottomView]) {
      [UIView transitionFromView:self.bottomView toView:self.topView duration:1.0f options:animationTransitionType completion:^(BOOL finished){
          [self.bottomView removeFromSuperview];
      }];
      [self.baseView addSubview:self.topView];
  } else {
      [UIView transitionFromView:self.topView toView:self.bottomView duration:1.0f options:animationTransitionType completion:^(BOOL finished){
          [self.topView removeFromSuperview];
      }];
      [self.baseView addSubview:self.bottomView];
  }
}
#pragma mark - LazyLoad 懒加载
- (UIView *)baseView {
    if (!_baseView) {
         _baseView = [[UIView alloc] initWithFrame:CGRectMake(20, NavBarHeight+20, 100, 150)];
         _baseView.backgroundColor = [UIColor whiteColor];
    }
    return _baseView;
}
- (UIView *)topView {
    if (!_topView) {
        _topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 150)];
        _topView.backgroundColor = [UIColor purpleColor];
    }
    return _topView;
 }
- (UIView *)bottomView {
    if (!_bottomView) {
         _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 150)];
        _bottomView.backgroundColor = [UIColor yellowColor];
    }
    return _bottomView;
}
/*** 阻尼动画 **/
- (void)dampingAnimation {
    //随即一个高度, 50~300
    CGFloat h = arc4random() % 251 + 50;
    //带有弹跳效果的动画
    //Damping:阻尼,取值0~1
    //Velocity:速度 像素/秒
    [UIView animateWithDuration:1 delay:0 usingSpringWithDamping:0.7 initialSpringVelocity:30 options:UIViewAnimationOptionCurveLinear animations:^{
    
        CGRect frame = self.animateIV.frame;
        frame.size.height = h;
        self.animateIV.frame = frame;
    } completion:nil];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容