iOS 之 UIView自带动画和核心动画
2015-12-30 22:18
561 查看
一、UIView自带动画(UIKit框架中)
注意:只有当UIView的以下属性改变时才能产生动画效果,且这些动画效果都是平面性的(二维的),基于手机屏幕的平面,主要有“平移(位置改变,沿x轴、Y轴或同时改变)”、“缩放(view大小改变,宽高)”、“旋转(只有沿Z轴,即垂直于屏幕的轴,旋转平行于屏幕)”、“背景色的改变”、“透明度”:
frame (平移 + 缩放)
bounds
(平移 + 缩放)
center
(平移)
transform
(变换【平移 + 缩放 +旋转】)
alpha
(透明度)
backgroundColor
(背景色)
contentStretch (6.0之后已经弃用)
重点介绍transform的使用:
eg:view.transform
= CGAffineTransformMakeScale(0.5, 0.5);
CGAffineTransform结构体详解
CGAffineTransform.h:
CGAffineTransformCGAffineTransformIdentity 默认值,保持原样不变
CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloatb,CGFloat c, CGFloat d, CGFloat tx, CGFloatty) 直接变换三维矩阵,很少用吧
创建变换=============
//Translation(平移)创建一个平移变换,起始位置 x 会加上tx , y会加上 ty
CGAffineTransform CGAffineTransformMakeTranslation(CGFloattx,CGFloat ty)
//Scale(缩放) 宽度就会变为 width*sx ,对应高度变为 hight * sy
CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloatsy)
//Rotation(旋转)将一个图片视图旋转了多少度,参数是弧度,先把度转化为弧度
CGAffineTransform CGAffineTransformMakeRotation(CGFloatangle) //90.0*(M_PI/180.0) 顺时针旋转90度,-90.0*(M_PI/180.0) 逆时针旋转90度,view的旋转方向仅以整个圆周最小的弧度,即270不会顺时针转3/4圈,而是逆时针转1/4圈,以180为界,大于等于180了就是逆时针了
增加变换===============
//为一个变换再加上平移变换
CGAffineTransform CGAffineTransformTranslate(CGAffineTransformt,CGFloat tx, CGFloat ty)
//为一个Transformation再加上缩放
CGAffineTransform CGAffineTransformScale(CGAffineTransformt,CGFloat sx, CGFloat sy)
//为一个Transformation再加上旋转
CGAffineTransform CGAffineTransformRotate(CGAffineTransformt,CGFloat angle)
其他====================
//判断一个变换是不是原生变换,即没有什么变换
boolCGAffineTransformIsIdentity(CGAffineTransform t)
//创建一个变换的反向效果
CGAffineTransform CGAffineTransformInvert(CGAffineTransformt)
//合并两个变换
CGAffineTransform CGAffineTransformConcat(CGAffineTransformt1,CGAffineTransform t2)
//判断两个变换是否一样
bool CGAffineTransformEqualToTransform(CGAffineTransformt1,CGAffineTransform t2)
(1).以begin commit的方式提交动画代码块:
[UIView beginAnimations:@"View Flip" context:nil];
[UIViewsetAnimationDuration:2.25]; //动画持续时间,秒
[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];//动画执行速度(UIViewAnimationCurveEaseInOut--动画开始和结束慢,中间快 UIViewAnimationCurveEaseIn--开始慢,后面快 UIViewAnimationCurveEaseOut--前面快,结束慢 UIViewAnimationCurveLinear--匀速)
[UIView setAnimationDelegate:self];//一定要设置动画的委托
................{改变View属性的代码块}...................
.........
[UIView commitAnimations];
说明:以上代码块便可以执行一个动画,其中的“{...}”块又可以嵌套新的动画块,
里面的动画块只有在 最外层的动画提交之后才会一起执行
其中有一个特例,可以实现view的翻页、立体旋转等效果:
+ (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)view cache:(BOOL)cache;
UIViewAnimationTransition宏介绍如下:
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
二、使用核心动画(CoreAnimation)[QuartzCore.framework中]
(1).UIView与CALayer的关系:http://www.cnblogs.com/mjios/archive/2013/04/14/3019728.html
http://www.cnblogs.com/lovecode/articles/2249548.html
实质上UIView中元素的展示与渲染都是考CALayer来实现,每个UIView都包含有一个layer属性,view与layer操作上也是一样,既能addSubLayers(addSubView)也能获取父视图(父layer),创建layer对象时也需指定大小(frame)、内容(content)、背景色等属性,唯一不同的时UIView还继承自UIResponder,便能响应用户事件,而CALayer直接继承自NSObject,不能响应
第一点中的直接操作UIView的某些属性便能产生动画,其实质就是操作改UIView对象中的Layer对象的属性
(2).QuartzCore框架中动画产生的原理
该框架中有三种类型的动画:
CABasicAnimation
CAKeyframeAnimation
CATransition
只要将创建好这三种动画对象add到layer上便能产生动画效果,不再需要使用第一点中UIView得代码块提交了,他们的继承关系如下:
(3).[b]CABasicAnimation和CAKeyframeAnimation是对图层中的不同属性进行动画的,即第一点所说的支持动画的那些属性
[/b]
CATransition *transition = [CATransition animation];
transition.duration = 2.0f;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromTop;
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
[self.view.layer addAnimation:transition forKey:@"animation"];
}
transition.type 的类型可以有
淡化、推挤、揭开、覆盖
NSString * constkCATransitionFade;
NSString * const kCATransitionMoveIn;
NSString * constkCATransitionPush;
NSString * const kCATransitionReveal;
transition.subtype
也有四种
NSString * const kCATransitionFromRight;
NSString * const kCATransitionFromLeft;
NSString * const kCATransitionFromTop;
NSString * const kCATransitionFromBottom;
[cpp]view plaincopy
animation.type = @"cube"
animation.type = @"suckEffect";
animation.type = @"oglFlip";//不管subType is "fromLeft" or "fromRight",official只有一种效果
animation.type = @"rippleEffect";
animation.type = @"pageCurl";
animation.type = @"pageUnCurl"
animation.type = @"cameraIrisHollowOpen ";
animation.type = @"cameraIrisHollowClose ";
下图是第一个cube立方体的效果:
可以控制动画进行的过程,可以让动画停留在某个动画点上,值在0.0到1.0之间。endProgress要大于等于startProgress。
比如上面的立方体转到,可以设置endProgress=0.5,让动画停留在转动一般的位置。
上面这些私有的动画效果,在实际应用中要谨慎使用。因为在appstore审核时可能会以为这些动画效果而拒绝通过。
(5).CAAnimation都是显式动画,即动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性
// 动画终了后不返回初始状态
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
(6).CABasicAnimation正在进行动画的时候,点击了Home按钮后再回到app的时候,动画会被清空。
http://blog.csdn.net/kqjob/article/details/10417461 http://blog.csdn.net/hufengvip/article/details/6913492 http://blog.csdn.net/totogo2010/article/details/8501812 http://www.cnblogs.com/project/archive/2011/09/27/2193556.html
注意:只有当UIView的以下属性改变时才能产生动画效果,且这些动画效果都是平面性的(二维的),基于手机屏幕的平面,主要有“平移(位置改变,沿x轴、Y轴或同时改变)”、“缩放(view大小改变,宽高)”、“旋转(只有沿Z轴,即垂直于屏幕的轴,旋转平行于屏幕)”、“背景色的改变”、“透明度”:
frame (平移 + 缩放)
bounds
(平移 + 缩放)
center
(平移)
transform
(变换【平移 + 缩放 +旋转】)
alpha
(透明度)
backgroundColor
(背景色)
contentStretch (6.0之后已经弃用)
重点介绍transform的使用:
eg:view.transform
= CGAffineTransformMakeScale(0.5, 0.5);
CGAffineTransform结构体详解
CGAffineTransform.h:
CGAffineTransformCGAffineTransformIdentity 默认值,保持原样不变
CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloatb,CGFloat c, CGFloat d, CGFloat tx, CGFloatty) 直接变换三维矩阵,很少用吧
创建变换=============
//Translation(平移)创建一个平移变换,起始位置 x 会加上tx , y会加上 ty
CGAffineTransform CGAffineTransformMakeTranslation(CGFloattx,CGFloat ty)
//Scale(缩放) 宽度就会变为 width*sx ,对应高度变为 hight * sy
CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloatsy)
//Rotation(旋转)将一个图片视图旋转了多少度,参数是弧度,先把度转化为弧度
CGAffineTransform CGAffineTransformMakeRotation(CGFloatangle) //90.0*(M_PI/180.0) 顺时针旋转90度,-90.0*(M_PI/180.0) 逆时针旋转90度,view的旋转方向仅以整个圆周最小的弧度,即270不会顺时针转3/4圈,而是逆时针转1/4圈,以180为界,大于等于180了就是逆时针了
增加变换===============
//为一个变换再加上平移变换
CGAffineTransform CGAffineTransformTranslate(CGAffineTransformt,CGFloat tx, CGFloat ty)
//为一个Transformation再加上缩放
CGAffineTransform CGAffineTransformScale(CGAffineTransformt,CGFloat sx, CGFloat sy)
//为一个Transformation再加上旋转
CGAffineTransform CGAffineTransformRotate(CGAffineTransformt,CGFloat angle)
其他====================
//判断一个变换是不是原生变换,即没有什么变换
boolCGAffineTransformIsIdentity(CGAffineTransform t)
//创建一个变换的反向效果
CGAffineTransform CGAffineTransformInvert(CGAffineTransformt)
//合并两个变换
CGAffineTransform CGAffineTransformConcat(CGAffineTransformt1,CGAffineTransform t2)
//判断两个变换是否一样
bool CGAffineTransformEqualToTransform(CGAffineTransformt1,CGAffineTransform t2)
(1).以begin commit的方式提交动画代码块:
[UIView beginAnimations:@"View Flip" context:nil];
[UIViewsetAnimationDuration:2.25]; //动画持续时间,秒
[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];//动画执行速度(UIViewAnimationCurveEaseInOut--动画开始和结束慢,中间快 UIViewAnimationCurveEaseIn--开始慢,后面快 UIViewAnimationCurveEaseOut--前面快,结束慢 UIViewAnimationCurveLinear--匀速)
[UIView setAnimationDelegate:self];//一定要设置动画的委托
................{改变View属性的代码块}...................
.........
[UIView commitAnimations];
说明:以上代码块便可以执行一个动画,其中的“{...}”块又可以嵌套新的动画块,
里面的动画块只有在 最外层的动画提交之后才会一起执行
其中有一个特例,可以实现view的翻页、立体旋转等效果:
+ (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)view cache:(BOOL)cache;
UIViewAnimationTransition宏介绍如下:
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
二、使用核心动画(CoreAnimation)[QuartzCore.framework中]
(1).UIView与CALayer的关系:http://www.cnblogs.com/mjios/archive/2013/04/14/3019728.html
http://www.cnblogs.com/lovecode/articles/2249548.html
实质上UIView中元素的展示与渲染都是考CALayer来实现,每个UIView都包含有一个layer属性,view与layer操作上也是一样,既能addSubLayers(addSubView)也能获取父视图(父layer),创建layer对象时也需指定大小(frame)、内容(content)、背景色等属性,唯一不同的时UIView还继承自UIResponder,便能响应用户事件,而CALayer直接继承自NSObject,不能响应
第一点中的直接操作UIView的某些属性便能产生动画,其实质就是操作改UIView对象中的Layer对象的属性
(2).QuartzCore框架中动画产生的原理
该框架中有三种类型的动画:
CABasicAnimation
CAKeyframeAnimation
CATransition
只要将创建好这三种动画对象add到layer上便能产生动画效果,不再需要使用第一点中UIView得代码块提交了,他们的继承关系如下:
(3).[b]CABasicAnimation和CAKeyframeAnimation是对图层中的不同属性进行动画的,即第一点所说的支持动画的那些属性
[/b]
(4).使用:CATransition
- (void)changeUIView2{CATransition *transition = [CATransition animation];
transition.duration = 2.0f;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromTop;
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
[self.view.layer addAnimation:transition forKey:@"animation"];
}
transition.type 的类型可以有
淡化、推挤、揭开、覆盖
NSString * constkCATransitionFade;
NSString * const kCATransitionMoveIn;
NSString * constkCATransitionPush;
NSString * const kCATransitionReveal;
transition.subtype
也有四种
NSString * const kCATransitionFromRight;
NSString * const kCATransitionFromLeft;
NSString * const kCATransitionFromTop;
NSString * const kCATransitionFromBottom;
私有的类型的动画类型:
立方体、吸收、翻转、波纹、翻页、反翻页、镜头开、镜头关[cpp]view plaincopy
animation.type = @"cube"
animation.type = @"suckEffect";
animation.type = @"oglFlip";//不管subType is "fromLeft" or "fromRight",official只有一种效果
animation.type = @"rippleEffect";
animation.type = @"pageCurl";
animation.type = @"pageUnCurl"
animation.type = @"cameraIrisHollowOpen ";
animation.type = @"cameraIrisHollowClose ";
下图是第一个cube立方体的效果:
CATransition的 startProgress endProgress属性
这两个属性是float类型的。可以控制动画进行的过程,可以让动画停留在某个动画点上,值在0.0到1.0之间。endProgress要大于等于startProgress。
比如上面的立方体转到,可以设置endProgress=0.5,让动画停留在转动一般的位置。
上面这些私有的动画效果,在实际应用中要谨慎使用。因为在appstore审核时可能会以为这些动画效果而拒绝通过。
(5).CAAnimation都是显式动画,即动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性
// 动画终了后不返回初始状态
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
(6).CABasicAnimation正在进行动画的时候,点击了Home按钮后再回到app的时候,动画会被清空。
http://blog.csdn.net/kqjob/article/details/10417461 http://blog.csdn.net/hufengvip/article/details/6913492 http://blog.csdn.net/totogo2010/article/details/8501812 http://www.cnblogs.com/project/archive/2011/09/27/2193556.html
相关文章推荐
- docfx daylybuild
- Android中更新UI的几种方式
- APUE学习笔记(第九章)
- [OC] UITabBarController
- SystemUI下拉通知栏的源码分析
- SystemUI底部三个虚拟按键的背景颜色修改
- Interface Builder一些使用技巧
- shareSDK自定义分享界面UI
- 关于easyui-datagrid数据表格, 分页取出数据
- 我对UiAutomator学习的一些总结
- UITextView in iOS7 doesn't scroll
- SQL Server 2008 R2 升级到 Service Pack 3后Report Builder启动不了
- 自定义UITableViewCell 上的多个按钮点击事件处理
- Windows pyqt4 bat自动转换UI文件-->.pyw文件
- jQquery
- myBatis源码之XMLConfigBuilder
- myBatis源码之XMLConfigBuilder
- myBatis源码之XMLConfigBuilder
- myBatis源码学习之SqlSessionFactoryBuilder
- myBatis源码学习之SqlSessionFactoryBuilder