导航控制器中的后退按钮动画

Posted

技术标签:

【中文标题】导航控制器中的后退按钮动画【英文标题】:Back Button Animation in Navigation Controller 【发布时间】:2010-06-30 04:20:08 【问题描述】:

CATransitions 可用于在向下钻取时为导航控制器中的过渡设置动画。但是,当使用返回按钮 og 导航控制器(返回)时,动画仍会滑出。有谁知道如何将 CATransition 附加到导航控制器的后退按钮?谢谢。

“向下钻取”时用于动画的代码:

CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromTop;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:nil];

【问题讨论】:

可以参考这个链接***.com/a/45343228/5437576 【参考方案1】:

无需创建自定义按钮...您可以简单地执行以下操作:

- (void)viewWillDisappear:(BOOL)animated

    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) 
        // back button was pressed.  We know this is true because self is no longer
        // in the navigation stack.  
        CATransition *transition = [CATransition animation];
        [transition setDuration:0.75];
        [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
        [transition setType:@"oglFlip"];
        [transition setSubtype:kCATransitionFromLeft];
        [transition setDelegate:self];
        [self.navigationController.view.layer addAnimation:transition forKey:nil];
    

    [super viewWillDisappear:animated];

编辑:您必须先添加石英框架才能使用 CATransition

【讨论】:

我刚试过这个并且开箱即用(漂亮的动画和所有:-) 这会通过苹果的审查吗?为什么这会覆盖自定义导航的动画? (我的意思是,我很高兴这样做,但根据代码不会这么说)【参考方案2】:

要为后退按钮添加动画,您必须创建自己的后退按钮,并在后退按钮动作上指定您想要的动画。

    向导航栏添加后退按钮:将此行添加到您的 viewDidLoad 方法中:

    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(back)];
    

    在后面的方法中添加这段代码:

    CATransition *transition = [CATransition animation];
    transition.duration = 1;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromBottom;
    transition.delegate = self;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];
    [self.navigationController popViewControllerAnimated:YES];
    

【讨论】:

shadowfax 发布的答案并没有完全删除呈现视图控制器完成的幻灯片动画。使用这个答案(自定义后退按钮)最适合替换动画,尽管我现在必须提供自定义后退按钮图像。【参考方案3】:

我不确定我是否理解这个问题。 UINavigationController 在切换视图时已经使用了幻灯片过渡。如果您想将自定义转换附加到后退按钮,您将必须创建一个自定义后退按钮并将其连接到将运行您的 CATransition 代码的操作。

【讨论】:

就是这样。 UINavigationController 使用幻灯片过渡,我需要它来翻转。【参考方案4】:

如果您想要导航控制器栏的后退按钮等动画,只需将以下代码放入您的操作中。

[self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案5】:

Swift 3 版本的 shadowfax 答案:

    let transition:CATransition = CATransition.init()
    transition.duration = 0.75
    transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = "oglFlip"
    transition.subtype = kCATransitionFromRight
    //transition.delegate = self // not needed
    self.navigationController?.view.layer.add(transition, forKey:nil)

【讨论】:

以上是关于导航控制器中的后退按钮动画的主要内容,如果未能解决你的问题,请参考以下文章

导航“后退”按钮暂停,以便在弹出之前做一个快速动画

在没有导航控制器的 UINavigationBar 中强制显示后退按钮

iOS导航控制器中的后退按钮回调

导航栏控制器中的自定义后退按钮

我可以用 xcode 中的“导航控制器后退按钮”传递数据吗

隐藏 MWPhotoBrowser 导航控制器中的后退按钮