iOS动画——UIKit动画
iOS动画
iOS有很多动画技术,API主要分布在两个库中,一个是UIKit,另一个是CoreAnimation,先对UIKit动画做一下总结。
UIKit动画
在UIKit中,很多API都可以看到animated参数,表示是否动画显示,其实这是UIKit封装CoreAnimation后的结果。
比如大家肯定都写过模态视图和导航控制器,他们在视图展示的时候都会有一个animated参数。
[self.navigationController pushViewController:vc animated:YES];
[self presentViewController:vc animated:YES completion:nil];
这些动画除了系统提供,其实我们是可以自己定制的,这里先简单提一下,下面在详细说。
主要API
UIKit主要API散落在UIView+UIViewAnimationWithBlocks和UIView+UIViewKeyframeAnimations两个分类
@interface UIView(UIViewAnimationWithBlocks) + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion + (void)performSystemAnimation:(UISystemAnimation)animation onViews:(NSArray *)views options:(UIViewAnimationOptions)options animations:(void (^)(void))parallelAnimations completion:(void (^)(BOOL finished))completion @end @interface UIView (UIViewKeyframeAnimations) + (void)animateKeyframesWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
+ (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations NS_AVAILABLE_IOS(7_0); @end
我们每个API挨着看一下
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
这个是动画的一个常用API,用于创建常用的动画,参数列表如下
| 参数 | 说明 | 
| duration | 持续时间 | 
| delay | 延时时间开始 | 
| options | 动画选项(下面详细解释) | 
| animations | 动画block | 
| completion | 动画结束后的回调 | 
下面我们看一个动画例子:
    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionAutoreverse animations:^{
        CGRect frame = testView.frame;
        frame.origin.y += ;
        testView.frame = frame;
    } completion:^(BOOL finished) {
        btn.hidden = YES;
    }];
这是在按钮click事件里面的一段代码,btn就是该按钮,testView定义如下
testView = [[UIView alloc] initWithFrame:CGRectMake(, , , )];
testView.backgroundColor = [UIColor blackColor];
[self.view addSubview:testView];
大家运行代码会发现,1秒后动画开始,运行了0.5秒,视图先向下再向上运动100回到原点,然后突然跳到100的位置按钮消失。
回到原点的原因是我们options写了UIViewAnimationOptionAutoreverse动画选项,该项会在东环正向运行后自动翻转动画运行一遍。
大家应该能开出来options可以设置动画的一些行为
options大体上可以分为三类,分为动画属性,动画线性关系,和动画转场效果。
动画属性:
| UIViewAnimationOptionLayoutSubviews | 在AutoLayout下,如果修改AutoLayout,那么子视图也会跟着一起变化 | 
| UIViewAnimationOptionAllowUserInteraction | 在动画时,允许用户交互,比如按钮在运动者还可以点击 | 
| UIViewAnimationOptionBeginFromCurrentState | 从当前状态开始动画 | 
| UIViewAnimationOptionRepeat | 重复动画 | 
| UIViewAnimationOptionAutoreverse | 动画执行完毕自动翻转 | 
| UIViewAnimationOptionOverrideInheritedDuration | 忽略外层动画嵌套的执行时间 | 
| UIViewAnimationOptionOverrideInheritedCurve | 忽略外层动画线性关系 | 
动画线性关系
| UIViewAnimationOptionShowHideTransitionViews | 用显隐的方式替代添加移除图层的动画效果 | 
| UIViewAnimationOptionOverrideInheritedOptions | 忽略嵌套继承的选项 | 
| UIViewAnimationOptionCurveEaseInOut | 时间曲线函数,由慢到快 | 
| UIViewAnimationOptionCurveEaseIn | 时间曲线函数,由慢到特别快 | 
| UIViewAnimationOptionCurveEaseOut | 时间曲线函数,由快到慢 | 
| UIViewAnimationOptionCurveLinear | 时间曲线函数,匀速 | 
动画转场效果
| UIViewAnimationOptionTransitionNone | 无转场动画 | 
| UIViewAnimationOptionTransitionFlipFromLeft | 转场从左翻转 | 
| UIViewAnimationOptionTransitionFlipFromRight | 转场从右翻转 | 
| UIViewAnimationOptionTransitionCurlUp | 上卷转场 | 
| UIViewAnimationOptionTransitionCurlDown | 下卷转场 | 
| UIViewAnimationOptionTransitionCrossDissolve | 转场交叉消失 | 
| UIViewAnimationOptionTransitionFlipFromTop | 转场从上翻转 | 
| UIViewAnimationOptionTransitionFlipFromBottom | 转场从下翻转 | 
转场动画
转场动画的API如下,是为了控制视图的跳转而使用的
[UIView transitionWithView:subView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        [subView addSubview:testView];
} completion:^(BOOL finished) {
}];
运行这段代码可以看到视图被翻转过来的时候添加了testView在上面。
[UIView transitionFromView:subView toView:testView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
这个方法可以控制一个控制器中的视图切换。
关键帧动画:
[UIView animateKeyframesWithDuration: delay: options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{
        [UIView addKeyframeWithRelativeStartTime: relativeDuration:0.25 animations:^{
            CGRect frame = testView.frame;
            frame.origin.y +=  * flag;
            testView.frame = frame;
        }];
        [UIView addKeyframeWithRelativeStartTime:0.25 relativeDuration:0.25 animations:^{
            CGRect frame = testView.frame;
            frame.origin.y -=  * flag;
            testView.frame = frame;
        }];
        [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{
            CGRect frame = testView.frame;
            frame.origin.y +=  * flag;
            testView.frame = frame;
        }];
    } completion:^(BOOL finished) {
        btn.hidden = YES;
    }];
可以看到,关键帧动画我们很方便的可以控制动画的整个过程,addKeyframeWithRelativeStartTime:是添加关键帧方法,参数startTime是一个在0~1之间的数字,表示开始时间占总时间的%多少,比如上例中的第一帧就是0,第二针就是25%也就是在0.5秒开始。relativeDuration和开始时间一样,是运行时间占整个时间的百分比。
弹簧动画
    [UIView animateWithDuration:0.5 delay:1.0 usingSpringWithDamping: initialSpringVelocity:0.1 options:UIViewAnimationOptionAutoreverse animations:^{
        CGRect frame = testView.frame;
        frame.origin.y +=  * flag;
        testView.frame = frame;
    } completion:^(BOOL finished) {
        btn.hidden = YES;
    }];
弹簧动画的阻尼值,也就是相当于摩擦力的大小,该属性的值从0.0到1.0之间,越靠近0,阻尼越小,弹动的幅度越大,反之阻尼越大,弹动的幅度越小,如果大道一定程度,会出现弹不动的情况。
弹簧动画的速率,或者说是动力。值越小弹簧的动力越小,弹簧拉伸的幅度越小,反之动力越大,弹簧拉伸的幅度越大。这里需要注意的是,如果设置为0,表示忽略该属性,由动画持续时间和阻尼计算动画的效果。
iOS动画——UIKit动画的更多相关文章
- iOS 视图,动画渲染机制探究
		腾讯Bugly特约作者:陈向文 终端的开发,首当其冲的就是视图.动画的渲染,切换等等.用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅.UI就是 App 的门面,它的体验 ... 
- iOS关于CoreAnimation动画知识总结
		一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了: ... 
- IOS中的动画菜单
		SvpplyTable(可折叠可张开的菜单动画) 允许你简单地创建可折叠可张开的菜单动画效果,灵感来自于Svpply app.不同表格项目使用JSON定义,你可以定义每个菜单项和任何子菜单,为每个项目 ... 
- iOS中的动画
		iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .fr ... 
- iOS之核心动画(Core Animation)
		Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core ... 
- iOS 8自定义动画转场上手指南
		原文:http://www.cocoachina.com/ios/20150126/11011.html iOS 5发布的时候,苹果针对应用程序界面的设计,提出了一种全新的,革命性的方法—Storyb ... 
- iOS 转场动画探究(一)
		什么是转场动画: 转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和Dismiss的时候设置一下系统给我们的modalTr ... 
- iOS 转场动画探究(二)
		这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ... 
- iOS中 Animation 动画大全  韩俊强的博客
		每日更新关注:http://weibo.com/hanjunqiang 新浪微博! iOS开发者交流QQ群: 446310206 1.iOS中我们能看到的控件都是UIView的子类,比如UIButt ... 
随机推荐
- node.js与HTML5离线缓存
			最近正学到HTML5的离线缓存,却看到需要配置服务器.一下子就懵了,毕竟服务器的有关配置一般是很复杂的,而node.js的服务器是自己的代码生成的,这下要怎么配置?在网上搜索了很久,都没用关于node ... 
- HDU5266 LCA 树链剖分LCA 线段树
			HDU5266 LCA Description 给一棵 n 个点的树,Q 个询问 [L,R] : 求点 L , 点 L+1 , 点 L+2 -- 点 R 的 LCA. Input 多组数据. The ... 
- zoj——2588    Burning Bridges
			Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ... 
- url处理函数
			function UrlOption(url) { this.url = url || ''; this.init(); this.change = function (url) { this.url ... 
- LeetCode 705. Design HashSet (设计哈希集合)
			题目标签:HashMap 题目让我们设计一个 hashset,有add,contains,remove 功能. 建立一个boolean array,index 是数字的值,具体看code. Java ... 
- wordpress 配置(ubuntu)---修改 linux hostname
			使用阿里云服务器的 ubuntu 系统时的 hostname 太扭曲,而且有些命令会受 hostname 的影响不能正常使用,所以,一定要改掉它! 永久修改 hostname: 使用 nano 命令: ... 
- HDU 5325 Crazy Bobo(思路+dfs 记忆化)
			Crazy Bobo Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Tota ... 
- Ajax之XMLHttpRequst对象
			XMLHttpRequest对象提供客户端与Http服务器异步通信的协议.通过该协议,Ajax可以使页面像桌面应用程序一样,只同服务器进行数据层的交换,而不用每次都刷新页面,也不用每次将数据处理工作提 ... 
- ios14--购物车优化2
			// // ViewController.m // 03-综合练习 // // Created by xiaomage on 15/12/28. // Copyright © 2015年 小码哥. A ... 
- string转date
			/*util-->sql*/ java.util.Date utdt; java.sql.Date sqldt =null; SimpleDateFormat simFormat = new S ... 
