• 动画编程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];

    效果图:

  • 相关阅读:
    [luogu3393]逃离僵尸岛
    [BZOJ2818]GCD
    [SCOI2015]情报传递
    [NOIP2010]引水入城
    [luogu4315]月下“毛景树”
    「LibreOJ NOI Round #2」不等关系
    [HNOI2013]游走
    Yet Another Minimization Problem
    ZJOI2015 地震后的幻想乡
    [九省联考2018]一双木棋chess
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4964165.html
Copyright © 2020-2023  润新知