iOS开发之动画编程的几种方法
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)内嵌
二:.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];
- }
iOS开发之动画编程的几种方法的更多相关文章
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- iOS开发进阶-实现多线程的3种方法
相关文章链接: 1.多线程简介 2.实现多线程的3种方法 ......待续 前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要 ...
- 【转】 ios开发之倒计时实现的两种方法
原文:http://blog.csdn.net/kylinbl/article/details/8972261 方法1:使用NSTimer来实现 主要使用的是NSTimer的scheduledTime ...
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...
- iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)
前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...
- iOS开发之网络编程--小文件下载
文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTT ...
- iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传
前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...
- iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载
本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方 ...
- iOS开发之网络编程--使用NSURLConnection实现文件上传
前言:使用NSURLConnection实现文件上传有点繁琐. 本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...
随机推荐
- Gridview中的数据导出到excel中
protected void btnExport_Click(object sender, EventArgs e) { //导出全部数据,取消分页 ...
- Java基础加强学习笔记(二)
一.反射的基础Class类 1.如何得到各个字节码对应的实例对象 (1)类名.class,例如 System.class (2)对象.getClass(),例如 new Data().getClass ...
- 【C++基础之十一】虚函数的用法
虚函数的作用和意义,就不进行说明了,这里主要讨论下虚函数的用法. 1.典型的虚函数用法 可以看到,只有标识为virtual的函数才会产生多态的效果,而且是编译多态.它只能借助指针或者引用来达到多态的效 ...
- 2015第29周二AOP
1.问题:想要添加日志记录.性能监控.安全监测 2.最初解决方案 2.1.最初解决方案:在每个需要的类函数中重复写上面处理代. 缺点:太多重复代码,且紧耦合 2.2.抽象类进行共性设计,子类进行个性设 ...
- ASP.NET获取IP的6种方法(转载于LanceZhang's Tech Blog)
服务端: //方法一 HttpContext.Current.Request.UserHostAddress; //方法二 HttpContext.Current.Request.ServerVari ...
- JDBC连接mysql编程
基本操作 package jdbc; import java.sql.Statement; import java.util.Scanner; import java.sql.Connection; ...
- [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX
[北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX [北京周六见]10 家创业公司联合招 Partner-均融资 1 ...
- spring注解理解
步骤一:编写web.xml文件,主要代码如下:<servlet> Java代码 <servlet-name>spmvc</servlet-name> <ser ...
- Android下如何理解onMeasure,onLayout的过程
在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下. View绘制过程就好比你向银行贷款, 在执行onMeasure的时候,好比银行告诉你 ...
- c++应用程序文件的编译过程
这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程. 一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件 ...