iOS 7 新特性之ViewController切换
2014-04-18 12:42
309 查看
自定义动画
iOS 7 对我来说最激动人心的特性就是新的视图控制器切换API(View Controller Transitioning API)。 iOS 7 之前,View Controller之间切换,我需要创建自定义的transitions。 而且这些方法都支持不完整,让人头疼。在transitions中增加交互功能就更难了。在开始这篇文章之前,我要提醒一下:这是一个新的API,我们尽最大努力让它可以实用,但是并不能保证是最佳。可能需要至少一个月后才能确定,这篇文章不是最佳的实用方案,这里只是一个对新功能的探索。如果有更好的使用这个API的方法,请联系我们,这样就可以修正这篇文章。
在开始介绍这个API之前,我们需要知道导航控制器的默认行为在iOS7下已经改变了:导航控制器下,切换2个view controller的动画有一点细微的改变,变得更有交互性。例如,当你希望弹出一个view controller时,可以从屏幕左边开始拖动,把整个内容拖动到屏幕右边。
让我们仔细看一下这个API,我发现这个被重度使用的接口是协议并不是一个实体。虽然一上来看上去有一点怪,但是我喜欢这个API,它给了我们更多的灵活性。我们从简单开始:用自定义动画代替原有的view controller的push动画(这里是sample
project 在GitHub)。我们首先需要实现这个新的
UINavigationControllerDelegate 方法:
让这个动画运行起来,我们创建一个自定义对象实现 UIViewControllerContextTransitioning 协议。
注意,我们只是写了push的自定义动画,当view controller pop时,iOS系统还是会使用默认的滑动动画。而且,实现这个方法后。导航栏也不能交互了(就是从左到右拖动实现pop view controller)。下面完善它
交互动画
让之前的动画变得能够交互起来非常简单。我们需要实现另一个UINavigationControllerDelegateinteractionController是UIPercentDrivenInteractionTransition的实例,没有必要更多的设置。我们通过创建拖动手势(UIPanGestureRecognizer)来实现:
最后,当手势停止或是取消掉,我们需要调用interaction controller相应的方法
现在我们已经有一个完整的自定义的可交互的过度变换(transition)了。通过普通的拖动手势和一个UIKit提供的实体对象,几行代码就搞定了。对于大多数的自定义交互过度变换,你可以在这里停下来,用上面提到的方法做任何你想做得动画 或是交互。
GPUImage自定义动画
我们现在已经能够实现一个完整的自定义动画了,可以不用UIView 甚至Core Animation,做自己喜欢的动画。一开始,我用Core Image实现了一个项目Letterpress-style。但是在我的旧iPhone4上面只能跑到大约9FPS,这个和我所期望的60FPS差距太大了。但是当我使用GPUImage后,实现一个非常漂亮的自定义动画效果变得非常简单。我们希望这个动画能够做到像素级的消融在2个view
controller切换的时候。这个是通过分别对2个view controller 截屏,然后应用GPUImage的图片滤镜实现的。
首先,我们创建一个自定义类,实现animation 和 interactive transition 协议。
创建这样的滤镜链非常方便。这里可以看一下下面的例子。有一点挑战的是实现动态的滤镜。GPUImage不能给我们直接提供动画效果。这里我们通过在每一帧的时候更新滤镜来实现动画的绘制。我们使用CADisplayLink类来做这个。
这个真的太强大了,你可以使用GPUImage提供的任何滤镜或是自己写的OpenGL代码来实现上面的效果。
小结
我们这里仅仅提到了导航控制器下面的2个 view controller 之间的动画,事实上你可以做相同的事情在tabbar controller 或是自定义的container view controller。而且 UICollectionViewController 现在已经可以在layout上面自动实现交互动画了。他们都是使用相同的机制。这个真的太强大了。当我和Orta提到这个API时,他指出他已经使用这个功能创建了一些轻量级的view controller。不要在每一个view controller
保存管理动画的代码,而是创建一个新的view controller,然后实现2个view controlller视图切换时的自定义的动画效果。
原文链接: Chris
Eidhof 翻译: 伯乐在线 - studentdeng
译文链接: http://blog.jobbole.com/51588/
[ 转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]
相关文章推荐
- tableView背景设置
- iOS多线程编程系类
- iOS实现九宫格效果
- iOS 开发中如何在非ARC的情况下编译ARC文件
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- ARC 在 Xcode5 中的设置
- 升级xcode5 ios7 后状态栏被导航栏遮挡的解决方案
- iOS 模态视图 demo
- ios开发 - CAAnimation keyPath的值
- iOS: CGPathAddArc和CGPathAddArcToPoint函数
- IOS中关于NSTimer使用知多少
- IOS中获取各种文件的目录路径的方法
- IOS消息推送服务端开发