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对象都负责和管理一个 ...
随机推荐
- delphi中EmbeddedWB网页html相互调用(二)
我们可以通过控件 EmbeddedWB_D5-D2010_Version_14.69.1 来响应html事件,还可以自定义html响应哪些html元素. 控件下载 点击下载 里面有demos文件夹大家 ...
- matlab使用reshape时按照列优先原则取元素和摆放元素
参考 http://blog.csdn.net/superdont/article/details/3992033 a=[1 2 3 4] 如果使用b=reshape(a,1,4),则得到的结果是 ...
- bzoj2285
完全是为了拼凑才出出来的吧先分数规划求出到基地入口的最小安全系数然后再最小点权覆盖集,只不过这里是带一定精度实数的流,其实是一样的 ; eps=0.001; type way=record po,ne ...
- 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境
发布于 2013-12-11 作者 Ross Gardler 微软开放技术有限公司 (MS Open Tech) 很高兴地宣布发行新的 Windows Azure Puppet 模块.通过这个模 ...
- Cocos2d-x 坑之二:目录改动后, cannot run on the selected destination
1:2dx开发中,目录改动后,经常会碰到这个提示错误: cannot run on the selected destination 解决方法:一般是因为 Info.plist文件属性问题,把 Ta ...
- 【转】Android中intent传递对象和Bundle的用法
原文网址:http://blog.csdn.net/lixiang0522/article/details/8642202 android中的组件间传递的对象一般实现Parcelable接口,当然也可 ...
- CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)
终于上手as了,感觉很爽 但是感觉也特闹心啊 还好有stackoverflow(这特么才是一个神奇的网站好吗) 废话少说 记录一下: 前面历经的磨难暂时不说了,就这个CPU acceleration ...
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- HTML5与CSS3权威指南.pdf8
第17章 与背景和边框相关的样式 与背景相关的新增属性 background-clip指定背景的显示范围 background-origin指定绘制背景图像时的起点 background-size指定 ...
- show drop down menu within/from action bar
show drop down menu within/from action bar */--> pre { background-color: #2f4f4f;line-height: 1.6 ...