iOS开发——动画编程的几种方法

动画编程的几种方法

IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKeyframeAnimation>,NSTimer

这里我就总结了一下这五种方法,其实iOS开发中动画的编程都会在这里面变化,所以只要弄懂了这些动画编程就不难了。

 

一:UIView动画

一般方式

[UIView beginAnimations:@"ddd" context:nil];//设置动画
[UIView commitAnimations]; //提交动画
这两个是必须有的,然后在两句的中间添加动画的代码
[UIView beginAnimations:@"ddd" context:nil];//设置动画 ddd为动画名称
[UIView setAnimationDuration:3];//定义动画持续时间
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; //setAnimationCurve来定义动画加速或减速方式
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.window cache:YES];
//设置动画的样式 forView为哪个view实现这个动画效果
[UIView setAnimationDelay:3]; //设置动画延迟多久执行
[UIView setAnimationDelegate:self]; //设置动画的代理 实现动画执行前后的方法 在commitAnimation之前设置
[UIView setAnimationDidStopSelector:@selector(stop)];//设置动画结束后执行的方法
[UIView setAnimationWillStartSelector:@selector(star)];//设置动画将要开始执行的方法
[UIView commitAnimations]; //提交动画
typedef enum {
UIViewAnimationTransitionNone, //普通状态
UIViewAnimationTransitionFlipFromLeft, //从左往右翻转
UIViewAnimationTransitionFlipFromRight, //从右往左翻转
UIViewAnimationTransitionCurlUp, //向上翻页
UIViewAnimationTransitionCurlDown, //向下翻页
} UIViewAnimationTransition;
typedef enum {
UIViewAnimationCurveEaseInOut,
UIViewAnimationCurveEaseIn,
UIViewAnimationCurveEaseOut,
UIViewAnimationCurveLinear
} UIViewAnimationCurve;
[UIView beginAnimations:@"ddd" context:nil]; //设置动画
view.frame = CGRectMake(200, 200, 100, 100);
[UIView commitAnimations]; //提交动画
当view从本来的frame移动到新的frame时会慢慢渐变 而不是一下就完成了 中间也可以添加到上面那段中间 只是多种效果重叠
以下这些也可以加到 [UIView beginAnimations:@"ddd" context:nil]; [UIView commitAnimations];之间
view.transform = CGAffineTransformMakeTranslation(10, 10);//设置偏移量 相对于最初的 只能偏移一次
view.transform = CGAffineTransformTranslate(view.transform, 10, 10); //设置偏移量 偏移多次
self.view.transform = CGAffineTransformMakeRotation(M_PI);//设置旋转度 只能旋转一次
self.view.transform = CGAffineTransformRotate(self.view.transform, M_PI); //旋转多次
self.view.transform = CGAffineTransformMakeScale(1.1, 1.1); //设置大小 只能改变一次 数值时相对于本来的几倍
self.view.transform = CGAffineTransformScale(self.view.transform, 1.1, 1.1);//改变多次
self.view.transform = CGAffineTransformIdentity;//回到当初的样子 执行一次
self.view.transform = CGAffineTransformInvert(self.view.transform);//得到相反的样子 大小 方向 位置执行多次
 

这里我实现了一个自定义的动画方法,方便使用,只需要调用就可以实现很好的功能。

 

方法的实现

-(void)UIViewAnimation:(UIView* )view frame:(CGRect)frame type:(int)type alpha:(float)alpha duration:(float)duration

{

//将对应的参数实现在方法中,调用的时候只需要输入方法中所需要的参数就能很好的调用这个方法,并且实现想要的功能!

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:duration];

    [UIView setAnimationCurve:type];

    [UIView setAnimationDelegate:self];

    view.alpha=alpha;

    view.frame=frame;

    [UIView commitAnimations];

}

调用方法

[self UIViewAnimation:downView frame:CGRectMake(0, height, 320, 58) type:UIViewAnimationCurveEaseOut alpha:1 duration:0.3];

 

Block方式

 

[UIView animateWithDuration:3 animations:^(void){
//这里相当于在begin和commint之间
}completion:^(BOOL finished){
//这里相当于动画执行完成后要执行的方法,可以继续嵌套block
}];
 高级一点的block动画(Next)内嵌

- (void)changeUIView{  
    [UIView animateWithDuration:2  delay:0   options:UIViewAnimationOptionCurveEaseOut animations:^(void){  
        moveView.alpha = 0.0;  
      }completion:^(BOOL finished){  
              [UIView animateWithDuration:1 delay:1.0   options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat    animations:^(void){                [UIView setAnimationRepeatCount:2.5];  
                  moveView.alpha = 1.0;  
              }completion:^(BOOL finished){                   
           }];       
    }];  
}  
 

二:.CAAnimation

需要添加库,和包含头文件

caanimation有多个子类

CABasicAnimation

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
//@""里的字符串有多种,可以自己找相关资料,一定要填对,动画才会执行 opacity设置透明度 bounds.size设置大小
[animation setFromValue:[NSNumber numberWithFloat:1.0]]; //设置透明度从几开始
[animation setToValue:[NSNumber numberWithFloat:0.3]];//设置透明度到几结束
[animation setDuration:0.1]; //设置动画时间
[animation setRepeatCount:100000];//设置重复时间
[animation setRepeatDuration:4]; //会限制重复次数
[animation setAutoreverses:NO];//设置是否从1.0到0.3 再从0.3到1.0 为一次 如果设置为NO则 1.0到0.3为一次
[animation setRemovedOnCompletion:YES]; //完成时移出动画 默认也是
[view.layer addAnimation:animation forKey:@"abc"];//执行动画
 

CAKeyframeAnimation

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];//设置view从初始位置经过一系列点
NSArray *postionAraay = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)], [NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue
valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 100)],nil];//设置点
NSArray *times = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.3],[NSNumber numberWithFloat:0.5],[NSNumber numberWithFloat:0.6],[NSNumber numberWithFloat:0.1],[NSNumber
numberWithFloat:1.0], nil]; //设置移动过程的时间
[animation setKeyTimes:times];
[animation setValues:postionAraay];
[animation setDuration:5]; //设置动画时间
[bigImage.layer addAnimation:animation forKey:@"dd"]; //执行动画
 

CATransition

CATransition *animation = [CATransition animation];
animation.duration = 0.5f;
animation.timingFunction = UIViewAnimationCurveEaseInOut;
animation.fillMode = kCAFillModeForwards;
/*
kCATransitionFade;
kCATransitionMoveIn;
kCATransitionPush;
kCATransitionReveal;
*/
/*
kCATransitionFromRight;
kCATransitionFromLeft;
kCATransitionFromTop;
kCATransitionFromBottom;
*/
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
[view.layer addAnimation:animation forKey:animation];
type也可以直接用字符串
/*
cube
suckEffect 卷走
oglFlip 翻转
rippleEffect 水波
pageCurl 翻页
pageUnCurl
cameraIrisHollowOpen
cameraIrisHollowClose
*/
 

三:NSTimer

这是一种定时器来操作动画的方法,他可以结合上面的方法来实现动画的多样化!

-(void) onTimer {
imageView.center = CGPointMake(imageView.center.x + delta.x,
imageView.center.y + delta.y);
if (imageView.center.x > self.view.bounds.size.width - ballRadius ||
imageView.center.x < ballRadius)
delta.x = -delta.x;
if (imageView.center.y > self.view.bounds.size.height - ballRadius ||
imageView.center.y < ballRadius)
delta.y = -delta.y;
}
- (void) viewDidLoad {
ballRadius = imageView.bounds.size.width / 2;
[slider setShowValue:YES];
delta = CGPointMake(12.0,4.0);
timer = [NSTimer scheduledTimerWithTimeInterval:slider.value
target:self
selector:@selector(onTimer)
userInfo:nil
repeats:YES];
[super viewDidLoad];
}
-(IBAction) sliderMoved:(id) sender {
[timer invalidate];
timer = [NSTimer scheduledTimerWithTimeInterval:slider.value
target:self
selector:@selector(onTimer)
userInfo:nil
repeats:YES];
//
timer = [NSTimer scheduledTimerWithTimeInterval:?
invocation:?
repeats:YES];
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。