博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【翻译】自定义 UIViewController Transitions
阅读量:4982 次
发布时间:2019-06-12

本文共 3538 字,大约阅读时间需要 11 分钟。

  原文地址:

  iOS7中引入了控制器间的切换切换动画,适用于UINavigationController栈内核modal显示

  iOS7 介绍了两种切换方式,一种是自动切换,另一种是交互式切换。下面就介绍一下NavigationController中实现fade动画切换。

  源码地址:

 

Navigation Controller Delegate

  在动画的世界里面充满了协议,然而现在这个项目中创建一个我们想要看见的视图,添加的协议需要交互式切换和模态视图的展现。

  UINavigationControllerDelegate协议提供了4个新方法,用来决定自定义动画的切换。

  我们感兴趣的方法是:

  

- (id
)navigationController: animationControllerForOperation: fromViewController: toViewController:

这个方法将会在导航控制器切换过度的时候调用(同样适用于storyboard适用segue的过度),所以我们可以决定返回哪种类型的切换。

 

我们创建一个类作为NavigationController的delegate

@interface SCNavControllerDelegate : NSObject 
@end

 

实现方法是:

@implementation SCNavControllerDelegate    - (id
)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { return [SCFadeTransition new]; }@end

我们想要所有的切换都是相同的,不管是进入还是返回,所以我们返回的是SCFadeTransition对象给每一次切换。

 

设置代理是非常见到你的,你可以在项目里面看见:

- (id)initWithCoder:(NSCoder *)aDecoder{    self = [super initWithCoder:aDecoder];    if(self) {        _navDelegate = [SCNavControllerDelegate new];        self.delegate = _navDelegate;    }    return self;}

 _navDelegate  是一个ivar类型id<UINavigationControllerDelegate>.

 

创建自定义变换

我们看见这个代理需要返回一些切换对象,也就是返回一个遵循UIViewControllerAnimatedTransitioning协议的对象,这个协议中有三个方法,其中两个是必须要实现的。

transitionDuration:(必须实现)。返回动画的持续时间

animateTransition:(必须实现)在控制器间实现动画的过度。提供一个我们需要的对象用来联系不同的组件。

animationEnded:(选择实现)这个会在动画完成之后调用,可以在动画完成之后触发一些方法。

 

我们定义一个SCFadeTransition类来实现这两个方法

@interface SCFadeTransition : NSObject 
@end

实现方法如下

- (NSTimeInterval)transitionDuration:(id
)transitionContext{ return 2.0;}

当animateTransition:方法调用的时候提供一个遵循UIViewControllerContextTransitioning协议的对象,这个对象用来获取动画完成的点点滴滴。第一个方法我们用 viewControllerForKey:,让我们能够掌握两个视图控制器间的过度。

// Get the two view controllersUIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

这个内容提供给我们一个UIView的动画,通过containerView方法联系

// Get the container view - where the animation has to happenUIView *containerView = [transitionContext containerView];

我们必须联系每一个视图控制器的子视图

// Add the two VC views to the container[containerView addSubview:fromVC.view];[containerView addSubview:toVC.view];

我们不想看见过度的视图,所以我们必须把alpha属性设置为0:

toVC.view.alpha = 0.0;

现在我们已经提供了一个动画,在控制器间切换有个简单的fade效果,我们可以用UIView animation block:

[UIView animateWithDuration:[self transitionDuration:transitionContext]                      delay:0                    options:0                 animations:^{                     toVC.view.alpha = 1.f;                 }                 completion:^(BOOL finished) {                     // Let's get rid of the old VC view                     [fromVC.view removeFromSuperview];                     // And then we need to tell the context that we're done                     [transitionContext completeTransition:YES];                 }];

 

知识点:

1、设置一个动画的持续时间,实现transitionDuration

2、"from"视图控制器的视图需要removed从view的层级中,当动画完成的时候。

3、completeTransition:方法在切换内容需要的时候调用,当动画完成的时候。

 

 

 

转载于:https://www.cnblogs.com/iOS-dd/p/3573231.html

你可能感兴趣的文章
curl实现多路并发请求(请求数量大时再次分割实现循环处理)
查看>>
调查问卷心得体会
查看>>
Linux文件3个时间点(access time,modify time,change time)
查看>>
深谈德国车和日本车的区别--觉得分析的还算冷静客观
查看>>
C#命名空间
查看>>
poj1655Multiplication Puzzle
查看>>
WinDebug 常用命令表【摘】
查看>>
LVS _keepalived 配置
查看>>
Django之ORM基础
查看>>
JS监听浏览器关闭事件
查看>>
[Log]ASP.NET之HttpModule 事件执行顺序
查看>>
明天回老家看我儿子了!
查看>>
hdu2089(数位dp模版)
查看>>
JS 获取浏览器和屏幕宽高信息
查看>>
TCP/UDP 协议,和 HTTP、FTP、SMTP,区别及应用场景
查看>>
我的大学生活
查看>>
php SPL四种常用的数据结构
查看>>
计算tableview的高度
查看>>
使用外语会影响我们的道德判断
查看>>
菜鸟学Java第一天
查看>>