在没有动画的xcode中推送segue


90

我正在使用普通的故事板,并在xcode中推送segues,但是我想让segues仅出现在下一个视图中,而不是滑动下一个视图(例如,当您使用选项卡栏并且仅出现下一个视图时)。

有没有一种简单的好方法就可以使普通的推送序列仅“显示”而不是“滑动”,而无需添加自定义序列?

一切工作都很好,我只想删除视图之间的幻灯片动画。


我刚刚尝试将推送segue更改为模态segue,因为这可以让我删除动画,但是我有一个带有顶部工具栏的tableview,并且将segue设置为modal会删除此顶部栏,并且我找不到任何方法重新添加顶部栏!因此,我需要一个不会为过渡设置动画但不会破坏我的表视图的解决方案。
理查德

Answers:


143

我能够通过创建自定义segue来做到这一点(基于此link)。

  1. 创建一个新的segue类(请参见下文)。
  2. 打开情节提要,然后选择segue。
  3. 将类设置为PushNoAnimationSegue(或您决定调用的任何类)。

在Xcode中指定segue类

斯威夫特4

import UIKit

/*
 Move to the next screen without an animation.
 */
class PushNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.source.navigationController?.pushViewController(self.destination, animated: false)
    }
}

目标C

PushNoAnimationSegue.h

#import <UIKit/UIKit.h>

/*
 Move to the next screen without an animation.
 */
@interface PushNoAnimationSegue : UIStoryboardSegue

@end

PushNoAnimationSegue.m

#import "PushNoAnimationSegue.h"

@implementation PushNoAnimationSegue

- (void)perform {

    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];
}

@end

感谢您的评论和输入。
理查德

11
最佳答案。关于实现反向动画的任何想法?
Thomas

1
奇迹般有效。这也是使用情节提要segue的“正确”方法。
杰夫·里奇利

1
有谁停止了以上答案的后退动画。
伊姆兰2014年

4
这不是解决方案,自定义segue像模式推送一样呈现在整个布局上,而原始的push segue支持window.frame navigationController tabBarController等...如何将segue配置为像推送segue而不是模式segue ?或... $ 1.000.000问题,当使用STORYBOARDS配置常规segue时,如何指定animation = NO
Pedro Borges

49

您可以在iOS 9的Interface Builder中取消选中“动画”

在此处输入图片说明


3
这是原始问题的答案!其他答案显示了如何在objc / swift代码中实现此目的,而dtochetto仅使用Xcode(如原始问题中的要求)。
drpawelo 2015年

但是,对于轻松的搜索来说,它似乎不起作用
Nicolas Manzini

2
这是最好,最快的解决方案,可惜这并不在iOS 8.工作
EricH206

2
@DanielT。也许可以在情节提要板上拖动2个segue,一个带有动画,而另一个没有动画。给他们起另一个Identifier名字。
AechoLiu

1
请注意,XCode只是向.storyboard文件中的segue元素添加了一个属性。您可以手动编辑.storyboard文件,然后将animates =“ NO”添加到您关心的序列中(如果您使用的是Visual Studio,并且设计器中没有选中标记)。
Wes

35

伊恩的答案很棒!

如果有人需要,这是Segue的Swift版本:

于SWIFT 5更新,2020年5月

PushNoAnimationSegue.swift

import UIKit

/// Move to the next screen without an animation
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
    if let navigation = source.navigationController {
        navigation.pushViewController(destination as UIViewController, animated: false)
    }
}

2
可能由于Swift版本,我需要“ as!” 而不是在两个地方都使用“ as”。
卡洛斯

1
嗯,也许在Swift 1.2中?我在Xcode 7 Beta1中使用Swift 2.0进行了检查,并且编译时没有任何警告。
zavié

6

现在,我已经使用以下代码设法做到这一点:

CreditsViewController *creditspage = [self.storyboard instantiateViewControllerWithIdentifier:@"Credits"];
[UIView beginAnimations:@"flipping view" context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:YES];
[self.navigationController pushViewController:creditspage animated:NO];
[UIView commitAnimations];

希望这对别人有帮助!


您可以将其添加到UIButton或其他任何操作中。如果要跳到没有动画的新视图控制器,可以使用:-void(yourUIButtonAction){CreditsViewController * creditspage = [self.storyboard InstantiateViewControllerWithIdentifier:@“ Credits”]; [self.navigationController pushViewController:creditspage动画:否]; }
理查德

这甚至没有回答问题。您在这里没有使用segue!
KIDdAe

4

这是Swift版本,适用于以模态方式呈现不带动画的ViewController:

import UIKit

/// Present the next screen without an animation.
class ModalNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.sourceViewController.presentViewController(
            self.destinationViewController as! UIViewController,
            animated: false,
            completion: nil)
    }

}

1
这段代码是从@zavié答案中复制的,没有添加任何内容,但确实更糟:不包括可选内容的检查
Diego Freniche 2015年

这与@zavié的答案不同,因为它显示了如何在不使用动画的情况下模态显示ViewController。在此可以作为参考,因为它与问题有些相关。
n.Drake

2

使用Swift3回答-

对于“推送” segue:

class PushNoAnimationSegue: UIStoryboardSegue
{
    override func perform()
    {
       source.navigationController?.pushViewController(destination, animated: false)
    }
}

对于“模态”搜索:

class ModalNoAnimationSegue: UIStoryboardSegue
{
    override func perform() {
        self.source.present(destination, animated: false, completion: nil)
    }
}

1

对于使用Xamarin iOS的任何人,您的自定义segue类都应如下所示:

[Register ("PushNoAnimationSegue")]
public class PushNoAnimationSegue : UIStoryboardSegue
{
    public PushNoAnimationSegue(IntPtr handle) : base (handle)
    {

    }

    public override void Perform ()
    {
        SourceViewController.NavigationController.PushViewController (DestinationViewController, false);
    }
}

别忘了,您仍然需要在故事板上设置自定义segue并将该类设置为PushNoAnimationSegue类。


0

对我而言,最简单的方法是:

UIView.performWithoutAnimation { 

        self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)

    }

可从iOS 7.0获得


如果使用自适应序列,我相信尽管performWithoutAnimation设置为禁用动画,但在序列执行之前,如果已选中“动画”,则会再次启用动画。执行后,它会再次禁用它们(如果以前曾禁用过)。
malhal

但是,您可以通过以下方法来解决此问题:创建UIStoryboardSegue子类,并在表演之前再次禁用动画(例如,使用构造函数检查是否禁用了动画并将其存储在属性中)。
malhal

0

我正在使用带有Xamarin的Visual Studio,并且设计器没有在dtochetto的答案中提供“ Animates”复选标记。

请注意,XCode设计器会将以下属性应用于.storyboard文件中的segue元素:animates =“ NO”

我手动编辑了.storyboard文件,并将animates =“ NO”添加到segue元素,它对我有用。

例:

 <segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>

0

无需动画即可推送:Swift 这对我有用。

import ObjectiveC

private var AssociatedObjectHandle: UInt8 = 0
    extension UIViewController {

        var isAnimationRequired:Bool {
            get {
        return (objc_getAssociatedObject(self, &AssociatedObjectHandle) as? Bool) ?? true
            }
            set {
                objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }

    -------------------- SilencePushSegue --------------------

class SilencePushSegue: UIStoryboardSegue {

    override func perform() {
        if self.source.isAnimationRequired == false {
            self.source.navigationController?.pushViewController(self.destination, animated: false)
        }else{
            self.source.navigationController?.pushViewController(self.destination, animated: true)
        }
    }
}

用法:从情节提要中设置segue类,如图所示。当您想在没有动画的情况下推送segue,并在调用self.performSegue之后将其设置为true时,将viewController中的isAnimationRequired设置为false。祝你好运...

DispatchQueue.main.async {
                self.isAnimationRequired = false
                self.performSegue(withIdentifier: "showAllOrders", sender: self);
                self.isAnimationRequired = true
            }

如图所示,从情节提要中设置segue类。


-1

只需设置animated UINavigationController.pushViewController斯威夫特

self.navigationController!.pushViewController(viewController, animated: false)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.