iOS - UIView的动画

作者: 搬砖的crystal | 来源:发表于2022-07-20 14:19 被阅读0次

一、位置动画

    UIView *viewA = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.view addSubview:viewA];
    viewA.backgroundColor = [UIColor orangeColor];
    
    [UIView animateWithDuration:2 animations:^{
        viewA.frame = CGRectMake(viewA.frame.origin.x, 400, viewA.bounds.size.width, viewA.bounds.size.height);
    }];

二、透明度、颜色动画

    //颜色动画
    [UIView animateWithDuration:2 animations:^{
        viewA.backgroundColor = [UIColor greenColor];
    }];
    
    //透明度
    [UIView animateWithDuration:2 animations:^{
        viewA.alpha = 0.3;
    }];

三、缩放动画

    [UIView animateWithDuration:4 animations:^{
        viewA.transform = CGAffineTransformMakeScale(2, 3);
    }];

CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)两个参数,代表 x 和 y 方向缩放倍数
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy);三个参数,第一个为要进行变换的矩阵

区别:
CGAffineTransformMakeScale 是对单位矩阵进行缩放。
CGAffineTransformScale 是对第一个参数的矩阵进行缩放
比如已经对一个 view 缩放 0.5,还想在这个基础上继续缩放 0.5,那么就把这个 view.transform 作为第一个参数传到 CGAffineTransformScale 里面,缩放之后的 view 则变为 0.25(CGAffineTransformScale(view.transofrm,0.5,0.5))。如果用 CGAffineTransformMakeScale 方法,那么这个 view 仍旧是缩放 0.5(CGAffineTransformMakeScale(0.5,0.5))

四、旋转动画

    [UIView animateWithDuration:4 animations:^{
        viewA.transform = CGAffineTransformRotate(viewA.transform, M_PI);
    }];

五、重复动画、延时动画

    [UIView animateWithDuration:2 delay:0.35 options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse animations:^{
        viewA.transform = CGAffineTransformRotate(viewA.transform, M_PI);
    } completion:^(BOOL finished) {
        
    }];

duration: 动画时长
delay: 决定了动画在延迟多久之后执行
options:用来决定动画的展示方式
animations:转化成动画表示的代码
completion:动画结束后执行的代码块

options类型

    UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动
    UIViewAnimationOptionAllowUserInteraction:动画过程中允许用户交互。
    UIViewAnimationOptionBeginFromCurrentState:所有视图从当前状态开始运行。
    UIViewAnimationOptionRepeat:重复运行动画。
    UIViewAnimationOptionAutoreverse :动画运行到结束点后仍然以动画方式回到初始点。
    UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套动画时间设置。
    UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套动画速度设置。
    UIViewAnimationOptionAllowAnimatedContent:动画过程中重绘视图(注意:仅仅适用于转场动画)。
    UIViewAnimationOptionShowHideTransitionViews:视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画
    UIViewAnimationOptionOverrideInheritedOptions :不继承父动画设置或动画类型。

    UIViewAnimationOptionTransitionNone:没有动画效果。
    UIViewAnimationOptionTransitionFlipFromLeft :从左侧翻转效果。
    UIViewAnimationOptionTransitionFlipFromRight:从右侧翻转效果。
    UIViewAnimationOptionTransitionCurlUp:向后翻页的动画过渡效果。
    UIViewAnimationOptionTransitionCurlDown :向前翻页的动画过渡效果。
    UIViewAnimationOptionTransitionCrossDissolve:旧视图溶解消失显示下一个新视图的效果。
    UIViewAnimationOptionTransitionFlipFromTop :从上方翻转效果。    
    UIViewAnimationOptionTransitionFlipFromBottom:从底部翻转效果。

    UIViewAnimationOptionCurveEaseInOut:动画效果先缓后逐渐加速。
    UIViewAnimationOptionCurveEaseIn :动画效果逐渐变慢。
    UIViewAnimationOptionCurveEaseOut:动画效果逐渐加速。
    UIViewAnimationOptionCurveLinear :动画效果匀速执行(默认)。

六、注意

在使用 Masonry 库的时候进行 [UIView animateWithDuration:2 animations:^{}]; 函数做动画效果时,必须要在该函数内部加上 [目标控件.superview layoutIfNeeded] 这条语句,否则会无法生成动画效果。

因为设置的约束并不会立即生效,所以我们需要用 layoutIfNeeded 来对其强制更新,再首次约束和让其开始动画的时候都得更新一次,否则动画的效果会很奇怪
和普通的方法实现差不多,重点只是修改约束后调用 [view.superview layoutIfNeeded]; 而已
用 Masonry 库做动画时,一定要使用 mas_updateConstraints 的更新约束

[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(400);
    make.left.mas_equalTo(100);
    make.size.mas_equalTo(CGSizeMake(100, 100));
}];

[view.superview layoutIfNeeded];//如果其约束还没有生成的时候需要动画的话,就请先强制刷新后才写动画,否则所有没生成的约束会直接跑动画

[UIView animateWithDuration:3 animations:^{
    [view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(200);
    }];

    [view.superview layoutIfNeeded];//强制绘制
}];

相关文章

网友评论

    本文标题:iOS - UIView的动画

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