实现动画的若干种方式

  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];

}

 

      

  

你可能感兴趣的:(UI)