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 ...
 
随机推荐
- Javascript Promise 学习 (中)
			
时隔多日,对promise有了多一点点的了解. 最近用angularjs 做开发,所以研究了一下它的 $q 功能不算很强大,算是简化版的 Q.js 参考了一下源码,不过我的等级还差很多... 作为学习 ...
 - sigaction 用法实例
			
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...
 - 切割 bitmap
			
最近在安卓手机控制蓝牙打印机打印图片,有时候图片太大,考虑到bitmap的切割,在此,献上代码,各位小主指点 public class ImageSplitter { public static Ar ...
 - 树形dp入门练习(hdu1011+hdu1061)
			
hdu1011 和 hdu1561类似,给定每个节点的花费以及价值,并且子节点必须在父亲节点取到以后才可以被取到 相当于是在树上进行的01背包 dp时考虑每一个子树 root和它的每一个儿子,状态转移 ...
 - jdk各个版本的特性
			
http://blog.csdn.net/mixiuali/article/details/8180100
 - double精度的坑与BigDecimal
			
近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进 ...
 - Oracle_Q&A_04
			
2014-12-19作业 [JSU]LJDragon's Oracle course tasks In the first semester, junior year --1.在管理员权限下创建一个新 ...
 - 谈谈Ext JS的组件——布局的用法
			
概述 在Ext JS中.包括两类布局:组件类布局和容器类布局.由于有些组件是有不同的组件组合而成的,如字段就由标题和输入框构成,他们之间也是存在布局关系的,而这就须要组件类布局来处理组件内自己特有的布 ...
 - linux安装mysql5.1.56
			
1.编译安装 > groupadd mysql #创建mysql组 > useradd -g mysql mysql #创建用户mysql并添加到mysql组中,这个用户主要是作为mysq ...
 - Boost库安装与使用
			
Boost 库非常不错,所以我今天就安了它一下下. Boost 库不是 C++ 标准库的一部分(据说在下一版本号的 C++ 标准会採纳它),但它有一些标准库所没有的非常实用的一些功能,比方我非常须要的 ...