美文网首页
iOS 动画之 UIView动画

iOS 动画之 UIView动画

作者: 树根曰 | 来源:发表于2017-11-04 18:17 被阅读0次

    在iOS开发者,几乎每个APP都会使用一些动画, 精美的动画给人非常舒适的体验,在APP开发中实现动画效果有很多种方式, 对于简单的应用场景,我们可以使用UIKit提供的画UIView动画来实现. UIKit提供给我们的动画接口。这些接口函数足够的强大并且十分的灵活, 足以满足我们开发中大部分的动画需求。

    在写动画之前我们一般会进行一下几点思考:

    • 动画前 View在哪儿?
    • 动画后 View会到哪儿?
    • 执行动画的这个View 以什么样的方式移动到目标位置?
    • 该动画持续多长时间?
    • ......等等

    在UIView中有很多属性用以描述一个UIView的状态,而动画就是让UIView从一个状态平滑的过渡到另外一个状态的过程。这些属性有:

    属性名             作用                                          
    frame           控制UIView的大小和该UIView在superview中的相对位置。
    bounds          控制UIView的大小
    center          控制UIView的位置
    transform       控制UIView的缩放,旋转角度等固定好中心位置之后的变化
    alpha           控制UIView的透明度
    backgroundColor 控制UIView的背景色
    contentStretch  控制UIView的拉伸方式
    

    通过设置这些属性,基本上就解决了动画中的移动到哪儿的问题。


    在这里我以 UIView frame 变化为例. 通过 UIKit 提供的接口, 实现我们需要的效果.

    一、基本动画

        1、最简洁的Block动画:包含时间和动画
        [UIView animateWithDuration:(NSTimeInterval)  //动画持续时间
                         animations:^{
                             //执行的动画
                         }];
        
        2、带有动画完成回调的Block动画
        [UIView animateWithDuration:(NSTimeInterval)  //动画持续时间
                         animations:^{
                             //执行的动画
                         }completion:^(BOOL finished) {
                             //动画执行完毕后的操作
                         }];
    

    demo 代码

    - (void)setUpView {
        
        //示例 view
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(70, 150, 200, 100)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        _view1 = view1;
        
        //
        UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(70, 280, 100, 50)];
        view2.backgroundColor = [UIColor greenColor];
        [self.view addSubview:view2];
        _view2 = view2;
    }
    //点击屏幕开始动画
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        
        [self showAnimation];
    }
    - (void)showAnimation {
        
        [UIView animateWithDuration:2.0f animations:^{
            
            _view2.frame = _view1.frame;
        }];
    }
    

    二、Spring动画

        iOS7.0后新增Spring动画(iOS系统动画大部分采用Spring Animation,适用于所有可被添加动画效果的属性)
        
        [UIView animateWithDuration:(NSTimeInterval)        //动画持续时间
                              delay:(NSTimeInterval)        //动画延迟执行的时间
             usingSpringWithDamping:(CGFloat)               //震动效果,范围0~1,数值越小震动效果越明显
              initialSpringVelocity:(CGFloat)               //初始速度,数值越大初始速度越快
                            options:(UIViewAnimationOptions)//动画的过渡效果(demo 中有详细介绍)
                         animations:^{
                             //执行的动画
                         }
                         completion:^(BOOL finished) {
                             //动画执行完毕后的操作
                         }];
    

    demo 代码

        [UIView animateWithDuration:2.0f
                              delay:0.f
             usingSpringWithDamping:0.5f
              initialSpringVelocity:5.0f
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             
                             _view2.frame = _view1.frame;
                         } completion:^(BOOL finished) {
                             
                             HW_Log(@"动画结束");
                         }];
    

    三、Keyframes动画

     1. iOS7.0后新增关键帧动画,支持属性关键帧,不支持路径关键帧    
        [UIView animateKeyframesWithDuration:(NSTimeInterval)//动画持续时间
                                       delay:(NSTimeInterval)//动画延迟执行的时间
                                     options:(UIViewKeyframeAnimationOptions)//动画的过渡效果
                                  animations:^{
                                      //执行的关键帧动画
                                  }
                                  completion:^(BOOL finished) {
                                      //动画执行完毕后的操作
                                  }];
    
    2.增加关键帧的方法:
        
        [UIView addKeyframeWithRelativeStartTime:(double)//动画开始的时间(占总时间的比例)
                                relativeDuration:(double) //动画持续时间(占总时间的比例)
                                      animations:^{
                                          //执行的动画
                                      }];
    

    demo 代码

    - (void)showAnimation {
        
        [UIView animateKeyframesWithDuration:8.0f
                                       delay:0.0f
                                     options:UIViewKeyframeAnimationOptionCalculationModeLinear
                                  animations:^{
                                      
                                      //关键帧动画
                                      [self keyframeAnimation];
                                  } completion:^(BOOL finished) {
                                      
                                     HW_Log(@"动画结束");
                                  }];
    
    }
    - (void)keyframeAnimation {
       
        [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:1.0 / 4 animations:^{
            
            _view1.backgroundColor = [UIColor blackColor];
        }];
        [UIView addKeyframeWithRelativeStartTime:1.0 / 4 relativeDuration:1.0 / 4 animations:^{
            
            _view1.backgroundColor = [UIColor cyanColor];
        }];
        [UIView addKeyframeWithRelativeStartTime:2.0 / 4 relativeDuration:1.0 / 4 animations:^{
            
            _view1.backgroundColor = [UIColor brownColor];
        }];
        [UIView addKeyframeWithRelativeStartTime:3.0 / 4 relativeDuration:1.0 / 4 animations:^{
            
            _view1.backgroundColor = [UIColor orangeColor];
        }];
    }
    

    四、转场动画

    1. 单个视图的过渡效果 <控制器内, 单个视图重新布局时, 动画效果>
        [UIView transitionWithView:(nonnull UIView *)
                          duration:(NSTimeInterval)
                           options:(UIViewAnimationOptions)
                        animations:^{
                            //执行的动画
                        }
                        completion:^(BOOL finished) {
                            //动画执行完毕后的操作
                        }];
    
    2 从旧视图转到新视图的动画效果 <控制器内, 两个 view 切换>
        [UIView transitionFromView:(nonnull UIView *)
                            toView:(nonnull UIView *)
                          duration:(NSTimeInterval)
                           options:(UIViewAnimationOptions)
                        completion:^(BOOL finished) {
                            //动画执行完毕后的操作
                        }];
        在该动画过程中,fromView 会从父视图中移除,并讲 toView 添加到父视图中,注意转场动画的作用对象是父视图(过渡效果体现在父视图上)。
        调用该方法相当于执行下面两句代码:
        
        [fromView.superview addSubview:toView];
        [fromView removeFromSuperview];
    

    demo 代码

    - (void)showAnimation1 {
        
        [UIView transitionWithView:self.view
                          duration:2.0f
                           options:UIViewAnimationOptionTransitionCurlUp
                        animations:^{
                            
                            self.view.backgroundColor = [UIColor orangeColor];
                        } completion:^(BOOL finished) {
                            
                            
                        }];
    }
    - (void)showAnimation2 {
        
        if (_selectedIndex == 0) {
            
            [UIView transitionFromView:self.firstView
                                toView:self.secondView
                              duration:2.0f
                               options:UIViewAnimationOptionTransitionFlipFromTop
                            completion:^(BOOL finished) {
                                
                                HW_Log(@"firstView 切换为 secondView");
                            }];
        }else{
            
            [UIView transitionFromView:self.secondView
                                toView:self.firstView
                              duration:2.0f
                               options:UIViewAnimationOptionTransitionFlipFromBottom
                            completion:^(BOOL finished) {
                                
                                HW_Log(@"secondView 切换为 firstView");
                            }];
        }
    }
    

    这样介绍怎么看都很苍白, 何不直接上代码?
    demo 中不仅有 UIView 动画的简单介绍, 还有一些更加生动的示例.

    最后, 写了一个 DEMO, 有兴趣的可以下载看看.😊

    相关文章

      网友评论

          本文标题:iOS 动画之 UIView动画

          本文链接:https://www.haomeiwen.com/subject/mlbfmxtx.html