• <UI>实现动画的若干种方式


      IOS中实现动画有3中方式:基于UIView的动画、基于Layer的动画和利用第三方包HMGL实现的动画。

      1.实现基于UIView的动画:图片淡入淡出动画的例子(改变Alpha值)

    - (void) alphaOut:(id)sender {
        // 准备动画
        [UIView beginAnimations:nil context:NULL];
        // 设置动画持续时间
        [UIView setAnimationDuration:5.0f];
        //要使视图 发生变化的相关代码
        [imageView0 setAlpha:0.0f];
        // 开始动画
        [UIView commitAnimations];
        // 这里打一条输出可以看出 程序在执行nslog的时候 动画还没有结束 所以动画是后台开一个线程自动执行
        NSLog(@"begin animation");
    }

      另外可用这种方式实现的例子还有:移入移出动画(移动frame,例子省略)

      利用coreGraphics包中的CGAffine实现图片旋转动画

    rotate
    - (void) rotate:(id)sender {
        // 取得当前的旋转引子
        CGAffineTransform t = [imageView0 transform];
        // 在t旋转引子上在旋转PI/2角度
        CGAffineTransform newT = CGAffineTransformRotate(t, M_PI/2.0f);
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0f];
        //设置代理和下面的两个函数是为了在动画执行过程(开始、进行、结束)中让controller执行其他方法,
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        [UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];
        //另外两个进行回调的函数
        // 动画开始会调用[self start:]
        // 动画停止会调用[self finish:];
        [imageView0 setTransform:newT];
        [UIView commitAnimations];
    }
    // 动画完成回调函数
    - (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
        NSLog(@"animation finish:%@", finished);
    }
    //动画将开始回调函数
    - (void) animationWillStart:(NSString *)animationID context:(void *)context {
        NSLog(@"animation start");
    }

      下面这个例子展示了UIView动画的形式控制

    turnPageUp
    - (void) turnPageUp:(id)sender {
        // 上翻页
        NSInteger imageViewIndex0 = [[parentView subviews] indexOfObject:imageView0];
        // 取得imageView0在父亲parentView重的index
        NSInteger imageViewIndex1 = [[parentView subviews] indexOfObject:imageView1];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:3.0f];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:parentView cache:YES];
        // UIViewAnimationTransitionCurlUp 上翻页
        // parentView 表示对parentView进行翻页
        // 换掉imageview0 和imageview1
        [parentView exchangeSubviewAtIndex:imageViewIndex0 withSubviewAtIndex:imageViewIndex1];
        [UIView commitAnimations];
    }

      2.基于CALayer的动画实现

    cube
    - (void)cube:(id)sender {
        //需要导入的包
        // <QuartzCore/QuartzCore.h>
        // QuartzCore.framework
        //定义一个转场动画
        CATransition *animation = [CATransition animation];
        [animation setDuration:2.0f];
        //可用类型
        //kCATransitionFade 交叉 淡化过渡
        //kCATransitionMoveIn 新视图移到旧视图上边
        //kCATransitionPush新视图推出旧视图
        //kCATransitionReveal旧视图移除
        //其它 @"cube",@"pageCurl",@"pageUnCurl",@"rippleEffect",@"suckEffect",@"oglFlip"
        //设置类型为cube
        [animation setType:@"cube"];
        //设置动画子类型,图片从哪儿开始切换,底部
        [animation setSubtype:kCATransitionFromBottom];
        //交换parentView两个子视图
        [parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
        //为parentView的layer添加设置好的动画,key是此动画的关键字
        [parentView.layer addAnimation:animation forKey:@"test"];
    }

      3.利用第三方包实现HMGL动画

    View Code
    - (void)htmlClicked:(UIButton *)sender {
        // 使用HMGL做3D变换
        // 需要导入的包:OpenGLES.framework、QuartzCore.framework
        
        // 初始化了一个具体door动作,实现的动画是Cloth转场动作
        ClothTransition *door = [[ClothTransition alloc] init];
        //单例模式的一个例子,新建一个HMGL转场的管理器
        HMGLTransitionManager *manager = [HMGLTransitionManager sharedTransitionManager];
        // 设置使用哪个动画专场,添加到manager对象中
        [manager setTransition:door]; 
        [door release];
        // 对parentView进行动画
        [manager beginTransition:parentView]; 
        [parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
        [manager commitTransition];
    }

          

      

  • 相关阅读:
    js事件循环机制event-loop
    javascript编译与执行
    css中rem,em,px的区别和使用场景
    float
    flex布局
    azoux's blog
    1004 成绩排名 PAT Basic Level
    1003 我要通过! PTA Basic Level
    腾讯云防盗链测试
    简单多项式求解
  • 原文地址:https://www.cnblogs.com/robinkey/p/2760878.html
Copyright © 2020-2023  润新知