iOS UIKit:animation
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);
@import url(/css/cuteeditor.css);
UIView视图的动画功能,可以使在更新或切换视图时有放缓节奏、产生流畅的动画效果,进而改善用户体验。为了当UIView属性值发生改变时就形成动画,需要将这些属性绑定到animation block中。其中在iOS4.0及之后可以使用block对象,而在之前只能使用UIView的animation开始和结束方法了。
1 动画属性
动画属性(animation property)是指当在animation块中修改了该属性,就能产生动画。如果修改表 11中的UIView类内置属性,那么将执行动画效果,但并不是说这些UIView属性就能自动生产动画。改变这些值只是立即更新view的属性而没有形成动画,为了一修改属性值就发生动画,必须改变动画块(animation block)中的值。
表 11 Animatable UIView properties
Property |
Changes you can make |
frame |
修改这个属性就是改变视图(view)的尺寸(size)和位置(position),在相对于父视图(superview)的坐标系统。(如果transform属性没有包含统一的transform,那么可以修改bounds或center属性来代替修改frame属性) |
bounds |
修改这个属性就是修改视图(view)的size值。 |
center |
修改这个值就是改变位置(position)值,在相对于父视图的坐标系统。 |
transform |
修改这个值就是对视图(view)进行缩放(scale)、旋转(rotate)、移动(translate)中心点的位置。 |
alpha |
修改这个值就是逐步改变视图(view)的透明度。 |
backgroundColor |
修改这个值就是改变视图(view)的背景色。 |
contentStretch |
修改这个值就是改变视图(view)内容的延展区域. |
2 Block-Based Methods
在IOS4.0之后的版本,可以使用基于block的类方法来实现动画。其中UIView有如下的动画方法:
+animateWithDuration:animations: +animateWithDuration:animations:completion: +animateWithDuration:delay:options:animations:completion: |
|
animateWithDuration方法实现动画效果非常简单,只需在animations块中实现动画属性变化。那么当执行该方法时,立即开始执行动画,并且动画执行是在其它线程执行,从而避免阻塞主线程的执行。
表 12 animateWithDuration方法options参数值[4]
类型 |
名称 |
描述 |
常规动画属性设置 (可选多个值) |
UIViewAnimationOptionLayoutSubviews |
动画过程中保证子视图跟随运动 |
UIViewAnimationOptionAllowUserInteraction |
动画过程中允许用户交互 |
|
UIViewAnimationOptionBeginFromCurrentState |
所有视图从当前状态开始运行 |
|
UIViewAnimationOptionRepeat |
重复运行动画 |
|
UIViewAnimationOptionAutoreverse |
动画运行到结束点后仍然以动画方式回到初始点 |
|
UIViewAnimationOptionOverrideInheritedDuration |
忽略嵌套动画时间设置 |
|
UIViewAnimationOptionOverrideInheritedCurve |
忽略嵌套动画速度设置 |
|
UIViewAnimationOptionAllowAnimatedContent |
动画过程中重绘视图(注意仅仅适用于转场动画) |
|
UIViewAnimationOptionShowHideTransitionViews |
视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画) |
|
UIViewAnimationOptionOverrideInheritedOptions |
不继承父动画设置或动画类型 |
|
动画速度控制 (只可选一个值) |
UIViewAnimationOptionCurveEaseInOut |
动画先缓慢,然后逐渐加速 |
UIViewAnimationOptionCurveEaseIn |
动画逐渐变慢 |
|
UIViewAnimationOptionCurveEaseOut |
动画逐渐加速 |
|
UIViewAnimationOptionCurveLinear |
动画匀速执行,默认值 |
|
转场类型 (仅适用于transitionWithView方法,且只可选一个值,基本动画、关键帧动画不需要设置) |
UIViewAnimationOptionTransitionNone |
没有转场动画效果 |
UIViewAnimationOptionTransitionFlipFromLeft |
从左侧翻转效果 |
|
UIViewAnimationOptionTransitionFlipFromRight |
从右侧翻转效果 |
|
UIViewAnimationOptionTransitionCurlUp |
向后翻页的动画过渡效果 |
|
UIViewAnimationOptionTransitionCurlDown |
向前翻页的动画过渡效果 |
|
UIViewAnimationOptionTransitionCrossDissolve |
旧视图溶解消失显示下一个新视图的效果 |
|
UIViewAnimationOptionTransitionFlipFromTop |
从上方翻转效果 |
|
UIViewAnimationOptionTransitionFlipFromBottom |
从底部翻转效果 |
如下采用animateWithDuration完整方法,设置两个视图的透明度变化:
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3 UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"firstView"];
4 _fisrtView = firstViewController.view;
5 [self.view addSubview:_fisrtView];
6 [self.view addSubview:_button];
7 _button.alpha = 1;
8 }
9 - (IBAction)buttonDown:(id)sender {
10 [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAutoreverse animations:^{
11 _fisrtView.alpha = 0.0;
12 _button.alpha = 1.0;
13 } completion:^(BOOL finished){
14 _fisrtView.alpha = 1;
15 _button.alpha = 1.0;
16 }];
17 }
3 Begin/Commit Methods
如果是IOS 3.2之前的版本,那么必须使用UIView的类方法beginAnimations和commitAnimations来实现效果。这两个方法标志着animation blocks的开始和结束,任何想要改变动画属性,都必须放置在这两个方法之间,当执行commitAnimations方法后才发生新值的修改。为了避免主线程的阻塞,所以动画的执行被系统放置在第二线程执行。如下的程序。
1 [UIView beginAnimations:@"ToggleViews" context:nil]; //开始执行animation块
2 [UIView setAnimationDuration:1.0]; //设置动画持续的时间
3
4 // Make the animatable changes.
5 firstView.alpha = 0.0;
6 secondView.alpha = 1.0;
7 [UIView commitAnimations]; // Commit the changes and perform the animation.
3.1 配置属性
若需要对动画效果更多的设计,那么采用表 13所示的UIView类方法。这些类方法需在beginAnimations和commitAnimations之间使用,
表 13 UIView的相关动画方法
Method |
Usage |
beginAnimations |
开始动画 |
commitAnimations |
提交UIView动画 |
setAnimationDuration |
设置动画块中的动画持续时间(用秒) |
setAnimationCurve |
设置动画块中的动画属性变化的曲线。动画曲线是动画运行过程中相对的速度。如果在动画块外调用这个方法将会无效。使用 beginAnimations:context:类方法来开始动画块并用commitAnimations来结束动画块。默认动画曲线的值是UIViewAnimationCurveEaseInOut。 |
setAnimationDelegate |
设置动画消息的代理。 |
setAnimationTransition |
设置动画方式,并指出动画发生的位置 |
commitAnimations |
|
setAnimationDelay |
在动画块中设置动画的延迟属性(以秒为单位) |
setAnimationRepeatCount |
设置动画在动画模块中的重复次数 |
setAnimationsEnabled |
设置是否激活动画,当动画参数没有被激活那么动画属性的改变将被忽略。默认动画是被激活的。 |
areAnimationsEnabled |
返回一个布尔值表示动画是否结束;如果动画结束返回YES,否则NO |
setAnimationStartDate |
设置在动画块内部动画属性改变的开始时间,使用beginAnimations:context:类方法来开始一个动画块并用commitAnimations类方法来结束动画块。默认的开始时间值由CFAbsoluteTimeGetCurrent方法来返回。 |
setAnimationWillStartSelector |
当动画开始时发送一条消息到动画代理 |
3.2 配置委托
如果在动画执行前后执行一些操作,那么必须设置委托对象。可以使用 setAnimationDelegate:方法来设置委托对象,使用 setAnimationWillStartSelector: 和 setAnimationDidStopSelector: 方法来设置开始和暂停操作。
- (void)animationWillStart:(NSString *)animationID context:(void *)context;
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;
animationID和context参数与beginAnimations:context:方法使用的参数一样,
4 转换动画
视图转换动画(View transitions)可以实现更加动感的动画,包括如下两种情况:
1) 在视图层次结构中,改变某视图的子视图显示效果;
2) 在视图层次结构中,用一个视图替换另一个视图。
注意视图转换动画(View transitions)仅仅影响视图的层次结构,而对视图控制器(view controller)不产生影响。即在执行转换动画之前,视图控制器处于active状态,那么在执行转换动画之后,视图控制器仍处于active状态。
4.1 改变子视图
若在视图层次架构中,改变一个存在视图的子视图显示效果,包括子视图的显示、隐藏、添加和移除等操作,那么可以使用transitionWithView方法实现动画效果。若需要合并其它动画改变,那么需要在options参数添加UIViewAnimationOptionAllowAnimatedContent值。
+ (void)transitionWithView:(UIView *)view
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion
options参数可以参考表 1‑2的参数设置;
在指定的视图中改变视图属性,从而实现动画;
4.2 替换视图
有时需要将一个视图替换为另一个视图,那么可以使用transitionFromView方法,该方法是将fromView视图从层次结构移除,并将插入toView视图,所以如果想再次使用fromView视图,那些需要保留该视图的引用。当然如果只是想隐藏fromView视图,而不删除该视图,可以在transitionFromView方法的options参数中加入UIViewAnimationOptionShowHideTransitionViews值。
+ (void)transitionFromView:(UIView *)fromView
toView:(UIView *)toView
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
completion:(void (^)(BOOL finished))completion
用fromView视图替换toView视图,从而实现动画;
5 参考文献
[1] View Programming Guide for IOS:Animations
[2] 网络地址
[3] http://edu.51cto.com/lesson/id-45316.html
[4] http://www.hangge.com/blog/cache/detail_664.html
[5] http://blog.sina.com.cn/s/blog_8d1bc23f0102vqs1.html
iOS UIKit:animation的更多相关文章
- iOS UIKit:viewController之动画(5)
当弹出一个view controller时,UIKit提供了一些标准转换动画,并且也支持用户自定义的动画效果. 1 UIView动画 UIView是自带动画实现功能,其中有两种方式实现: ...
- iOS UIKit:viewController之定义(2)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- iOS UIKit:view
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- iOS UIKit:TableView之编辑模式(3)
一般table view有编辑模式和正常模式,当table view进入编辑模式时,会在row的左边显示编辑和重排控件,如图 42所示的编辑模式时的控件布局:左边的editing control有表 ...
- iOS UIKit:TableView之单元格配置(2)
Table View是UITableView类的实例对象,其是使用节(section)来描述信息的一种滚动列表.但与普通的表格不同,tableView只有一行,且只能在垂直方向进行滚动.tableVi ...
- iOS UIKit:Navigation Controllers
navigation controller是一种层次结构的container view controller,即其通过一个view controllers栈来管理内部的content view con ...
- iOS UIKit:viewController之Segues (4)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- iOS UIKit:viewController之Present (3)
弹出和转换view controller技术是一种快速且简单的方式将新view content展示在屏幕中.目前有两种方式弹出新的view controller:Present方式和segues方式. ...
- iOS UIKit:viewController之层次结构(1)
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁.且应用程序至少有一个view controller.每个view controller对象都负责和管理一个 ...
随机推荐
- 转:在Eclipse中进行C/C++开发的配置方法(20140721最新版)
http://blog.csdn.net/baimafujinji/article/details/38026421 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它 ...
- [转贴] C/C++中动态链接库的创建和调用
DLL 有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.下面为你介绍C/C++中动态链接库的创建和调用. 动态连接库的 ...
- C++解析JSON之JsonCPP
一.JSON简介 JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读.编写.解析. JSON由两种基本结构构成: )"名称/值" ...
- java 二叉搜索树
java二叉查找树实现: 二叉查找树,上图:比根节点小者在其左边,比根节点大者在其右边. 抽象数据结构,上代码: /** * 二叉查找树数据结构(非线程安全): * 范型类型须实现Comparable ...
- _GUN_SOURCE宏
问题描述:在编译程序时,提示一个错误和一个警告. error:storage size of tz isn’t know: 其中tz是struct timezone类型的变量. warning:imp ...
- Delta-wave
Delta-wave Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Oracle由ID生成父ID的函数
/*表结构*/ CREATE TABLE ly_md ( bh BYTE), mc BYTE), pym BYTE), f_bh BYTE), ch NUMBER, ID NUMBER ); INSE ...
- Bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 广搜,深搜
1687: [Usaco2005 Open]Navigating the City 城市交通 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 122 So ...
- 51单片机连接24C02-C语言测试代码
忙了一天多终于透彻了,自己写的不好使,用别人的逐步分析改成自己的,我写得非常简洁易懂. 我总结3点需要注意的地方 1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会 ...
- Testing和Instrumentation(转)
Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架.尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个方面 ...