iOS 7 中为 ViewControllers 间(Navigation Push / Pop 或者 Modal Present / Dismiss)的切换和交互增加了特性,你可以自定义切换的动画效果和切换过程的交互动作
API 介绍
相关的内容都定义在:
UIVIewControllerTransitioning.h
文件中
0、@protocol UIViewControllerContextTransitioning
这个协议的接口中定义了一些 ViewControllers 之间切换上下文(动画+交互)中所需的相关信息。
一般来说,The UIViewControllerContextTransitioning protocol can be adopted by custom container controllers。我们平时只需关注其中的方法,拿来用就好了。
例如:
1、 @protocol UIViewControllerAnimatedTransitioning
这个协议的接口负责切换过程的动画效果。一般的,我们可以通过创建一个(subclass of NSObject)类实现这个接口,然后通过该类对象来使用自定义的动画效果。
|
|
2、 UIViewControllerInteractiveTransitioning
这个协议的接口负责切换过程的交互动作。这个接口比较简单,我们只需在 :- (void)startInteractiveTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
方法中实现所需的切换交互动作即可。
当然其中还有两个可选实现方法:
Note: 一般来说 view controller 间的动画切换都是通过某些手势来实现的。通常用到的时 Pan 手势。
3、 UIPercentDrivenInteractiveTransition
系统已经为我们实现了一个交互动作 – 百分比切换动作,这个类实现了 UIViewControllerInteractiveTransitioning
接口,我们可以直接创建这个类对象进行使用(一般都是结合 Pan 手势使用)
其中比较重要的方法有:
4、 UIViewControllerTransitioningDelegate
这个协议负责向系统返回切换的动画效果和切换的交互动作。我们在需要进行 Custom Transition 的 view controller 中实现这个接口,返回相应的对象即可。(一般来说,在 Modal Present / Dismiss 切换中实现以下协议)
5、UINavigationControllerDelegate
对于 Navigation Controller 中的(Push / Pop)切换,我们需要实现该协议,选择性实现以下的方法:
题外话:我们注意到以上 API 接口中,很多都是委托协议。那么有一点值得提示的是,我们在 Modal Present / Dismiss 时,当要进行 Dismiss 时候,苹果建议也是用委托的方式进行(此处不展开)。
When it comes time to dismiss a presented view controller, the preferred approach is to let the presenting view controller dismiss it. In other words, whenever possible, the same view controller that presented the view controller should also take responsibility for dismissing it. Although there are several techniques for notifying the presenting view controller that its presented view controller should be dismissed, the preferred technique is delegation.
Demo
说明:从 iOS 7 开始 Navigation Controller 附赠了一个从屏幕左侧边缘右滑返回的手势,但是仅限于屏幕左侧边缘,那么如何扩大到整个屏幕呢?当然,有了以上这些强有力的 API ,我们是可以实现的。
效果如下:
1、基础代码(项目中包含两个VC:FirstViewController SecondViewController)
其中 FirstViewController 视图中有一个 btn 用于跳转到 SecondViewController
2、定制 Pan 手势,我们只在 Pan 手势是向右滑动的时候才做响应。
|
|
注意:#import <UIKit/UIGestureRecognizerSubclass.h>
3、定制切换动画效果
为 UIView 添加了一个扩展方法:使得 pop 出的视图在左侧边缘添加一个阴影,且随着移动渐变。
接着就是实现 UIViewControllerAnimatedTransitioning
协议中的方法了
3、添加 Pan 手势 和 UINavigationControllerDelegate
委托方法中的处理
我们创建一个类:@interface SwipeToPop : NSObject <UINavigationControllerDelegate>
我们传入一个 NavigationController 对象,然后为其添加 Pan 手势
|
|
然后,实现 UINavigationControllerDelegate
的委托方法
最后在 FirstViewController 中补充: