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对象都负责和管理一个 ...
随机推荐
- OA学习笔记-002-Sruts2.1配置
一.jar commons-fileupload-1.2.1.jarcommons-io-1.3.2.jarfreemarker-2.3.15.jarognl-2.7.3.jarstruts2-cor ...
- 【HDOJ】3127 WHUgirls
#include <stdio.h> #include <string.h> #define mymax(a, b) (a>b) ? a:b typedef struct ...
- git撤销提交到remote的commit
Reseting remote to a certain commit Assuming that your branch is called master both here and remotel ...
- POJ 3074 Sudoku (Dacing Links)
推荐一个写数独很好的博客:http://www.cnblogs.com/grenet/p/3163550.html 主要是把九宫格里的元素换到矩阵里面再求解dancing links 网上找的一模版 ...
- HTML5与CSS3权威指南.pdf7
第14章 使用选择器在页面中插入内容 使用选择器来插入文字图片 上一章提到过使用before和after伪类为某个元素之前或之后插入内容 h2:after{content:'12345'},也可以指定 ...
- Hdu 5213-Lucky 莫队,容斥原理,分块
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others) Me ...
- 如何让虚拟目录里面的webconfig不继承网站的设置
在一个网站 中国红木网 下 建一个虚拟目录,结果虚拟目录系统会调用 中国红木网 上的web.config, 在网上找到以下解决方案 在(如根目录)所在的Web.config加上 如:<locat ...
- 字符串hash函数
本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...
- SpringMVC 常用注解
本文参考了博客,具体请见:http://www.cnblogs.com/leskang/p/5445698.html Spring MVC的常用注解 1.@Controller @Controller ...
- ffmpeg的logo, delogo滤镜参数设置
FFmpeg的添加logo,去logo滤镜的组合共有三种方式: 1. 只有添加logo滤镜 $ ./ffmpeg -i INPUT.FLV \ -vf movie=/opt/logo.png[log ...