动画编程1

uiview动画用到的一些属性:

frame  
bounds  
center  
transform  
alpha  
backgroundcolor  
contentstretch  

在用oc做uiview的frame修改时,会出现以下错误:

expression is not assignable”

事例如下:

[UIView animateWithDuration:0.3 animations:^{
        _myView.frame.origin.x += 100;
    }];

原因是:self.view.frame是Objective-C语法,是读取view属性的frame属性,在Objective-C中使用点来访问属性只是一种语法糖,所以self.view.frame这句话会被转换成:[[self view] frame]。也就是说,实际上这是消息传递。而frame属性是一个CGRect结构,所以frame.size.height是C语言的语法,就是访问CGRect结构中的size字段,同样,height是CGSize结构的一个字段。而Objective-C只是对C语言的一个扩展,所以,上面这句话会被转成C语言的函数调用形式。而在C语言里,函数的返回值是一个R-Value,是不能直接给它赋值的(所谓的R-Value,就是只能出现在等号的右边,你可以理解成是一个常量;而可以被赋值的是L-Value,可以出现在等号的左边,通常是变量)。因此,当你打算直接给函数的返回值赋值的时候,编译器告诉你"这个表达式无法被赋值"。这就是这个错误的出现原因。所以,解决办法就是,用一个临时变量保存这个函数的返回值,修改这个临时变量,然后再赋给frame:

[UIView animateWithDuration:0.3 animations:^{
        CGRect temp = _myView.frame;
        temp.origin.x += 100;
        _myView.frame = temp;
    }];

效果图:

上面这个方法基本上实现了视图的右移,也就是修改了view的frame时使用。

2.UIViewAnimationOptions的使用

它可以配置三种类型:

1).动画控制相关

LayoutSubviews  提交动画的时候布局子控件,表示子控件和父控件一同动画

AllowUserInteraction  动画时允许用户交流

BeginFromCurrentState   从当前状态开始动画

Repeat   动画无限重复

Autoreverse  执行动画回路,设置动画无限重复

OverrideInheritedDuration   忽略外层动画的嵌套时间

OverrideInheritedCurve      忽略外层动画的嵌套时间变化曲线

OverrideInheritedContent    通过改变属性和重会实现动画效果,如果key没有提交动画将使用快照

ShowHideTransitionViews    用显隐的方式替代添加移除图层的动画效果 

OverrideInheritedOptions    忽略嵌套继承的选项

2).时间曲线相关

     CurveEasyIn       CurveEasyInOut       CurveEasyOut           CurveLinear

       由快到慢               

3).转场效果相关:比如:两个controller的切换

TransitionNone   无转场

TransitionFlipFromLeft  从左往右的翻转

TransitionFlipFromRight   从右往左的翻转

TransitionCurlUp  上卷转场

TransitionCurlDown  下卷转场

TransitionCrossDissolve  转场交叉消失

TransitionFlipFromTop  转场从上翻转

TransitionFlipFromButton   转场从下翻转

使用repeat和CurveLinear实现:

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat animations:^{
        CGRect temp = _myView.frame;
        temp.origin.x += 100;
        _myView.frame = temp;
    } completion:nil];

效果图:

3.使用beginCommitAnimate来实现动画

改变背景颜色:

 //1.声明动画开始并配置动画属性
    [UIView beginAnimations:@"text" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationRepeatCount:8];
    [UIView setAnimationRepeatAutoreverses:YES];
    //2.操作视图
    self.myView.backgroundColor = [UIColor blueColor];
    //3.提交动画
    [UIView commitAnimations];

效果图:

3.Nest(内层嵌套动画)

内层动画默认继承外层动画的一些属性(duration,curve等),因此,在设置内层动画的时候,可以设置如下的属性,使得内层动画独立运作

OverrideInheritedCurve       OverrideInheritedDuration         OverrideInheritedOperations

重写继承的时间曲线                重写继承的时间                           重写继承的属性

[UIView animateWithDuration:3.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
        CGRect temp = _myView.frame;
        temp.origin.x += 100;
        _myView.frame = temp;
        [UIView animateWithDuration:2.0 delay:0.1 options:UIViewAnimationOptionOverrideInheritedCurve|UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionOverrideInheritedDuration animations:^{
            CGRect temp = _mySecondView.frame;
            temp.origin.x += 100;
            _mySecondView.frame = temp;
        } completion:nil];
    } completion:nil];

效果图:

原文地址:https://www.cnblogs.com/moxuexiaotong/p/4964165.html