深入学习iOS7自定义导航转场动画

2020-01-14 20:05:04刘景俊

交互控制器:最简单的实现方式有两种方式可以创建交互控制器。第一个也是最简单的一个,就是使用UIPercentDrivenInteractiveTransition。


 @interface UIPercentDrivenInteractiveTransition : NSObject 
 
@property (readonly) CGFloat duration; 
@property (readonly) CGFloat percentComplete; 
@property (nonatomic,assign) CGFloat completionSpeed; 
@property (nonatomic,assign) UIViewAnimationCurve 
completionCurve; 
- (void)updateInteractiveTransition:(CGFloat)percentComplete; 
- (void)cancelInteractiveTransition; 
- (void)finishInteractiveTransition; 

这个类具体实现了UIViewControllerInteractiveTransitioning协议,我们可以使用它轻松为动画控制器添加自定义的交互方式。只要为目标视图加入手势(或者其他交互方式)并调用updateInteractiveTransition:,传入动画时间占整个过程的百分比即可。同时, 记住在交互完成后调用finishInteractiveTransition: , 交互被取消时调用cancel-InteractiveTransition:。下面的例子展示了如何将捏合手势应用到转场动画中: 


-(void)handlePinch:(UIPinchGestureRecognizer *)pinch { 
CGFloat scale = pinch.scale; 
switch (pinch.state) { 
case UIGestureRecognizerStateBegan: { 
_startScale = scale; 
self.interactive = YES; 
[self.navigationController 
popViewControllerAnimated:YES]; 
break; 
} 
case UIGestureRecognizerStateChanged: { 
CGFloat percent = (1.0 - scale/_startScale); 
[self updateInteractiveTransition:(percent < 0.0) ? 
0.0 : percent]; 
break; 
} 
case UIGestureRecognizerStateEnded: { 
CGFloat percent = (1.0 - scale/_startScale); 
BOOL cancelled = ([pinch velocity] < 5.0 && percent 
<= 0.3); 
if (cancelled) [self cancelInteractiveTransition]; 
else [self finishInteractiveTransition]; 
break; 
} 
case UIGestureRecognizerStateCancelled: { 
CGFloat percent = (1.0 - scale/_startScale); 
BOOL cancelled = ([pinch velocity] < 5.0 && percent 
<= 0.3); 
if (cancelled) [self cancelInteractiveTransition]; 
else [self finishInteractiveTransition]; 
break; 
} 
} 
} 

当你继承了UIPercentDrivenInteractiveTransition类,交互过程中系统会自动调用动画控制器的animateTransition:方法,按照你传递的percentComplete参数实时地展现动画效果。在交互完成后,它还自动调用animateTransition:方法恢复到正常状态,一旦交互完成,我们就可以改变completionSpeed和completionCurve属性来修改其他的一些样式。

交互控制器:通过自定义的方式
如果你需要深入控制UIPercentDrivenInteractiveTransition处理转场动画的细节,那么就不用去继承该类,而是使用UIViewController-InteractiveTransitioning协议。此协议与UIViewController-AnimatedTransitioning类似,我们可以通过该协议控制所有关于转场动画的细节。在该协议中我们需要完成以下步骤: