Drücken Sie Segue in Xcode ohne Animation

90

Ich verwende normales Storyboarding und Push-Segmente in xcode, aber ich möchte Segmente haben, die nur in der nächsten Ansicht angezeigt werden, nicht in der nächsten Ansicht (wie wenn Sie eine Registerkartenleiste verwenden und die nächste Ansicht nur angezeigt wird).

Gibt es eine schöne einfache Möglichkeit, normale Push-Segmente nur "erscheinen" und nicht "schieben" zu lassen, ohne benutzerdefinierte Segmente hinzufügen zu müssen?

Alles funktioniert einwandfrei, ich möchte nur diese Folienanimation zwischen den Ansichten entfernen.

Richard
quelle
Ich habe gerade versucht, das Push-Segment in ein modales Segment zu ändern, da ich dadurch die Animation entfernen kann. Ich habe jedoch eine Tabellenansicht mit einer oberen Symbolleiste. Wenn Sie das Segment auf modal setzen, wird diese obere Leiste entfernt, und ich kann keinen Weg finden um die obere Leiste wieder hinzuzufügen! Ich brauche also eine Lösung, die den Übergang nicht animiert, aber meine Tabellenansicht nicht unterbricht.
Richard

Antworten:

143

Ich konnte dies tun, indem ich einen benutzerdefinierten Übergang erstellte (basierend auf diesem Link ).

  1. Erstellen Sie eine neue Segue-Klasse (siehe unten).
  2. Öffnen Sie Ihr Storyboard und wählen Sie den Abschnitt aus.
  3. Setzen Sie die Klasse auf PushNoAnimationSegue(oder wie auch immer Sie sie nennen möchten).

Geben Sie die Segue-Klasse in Xcode an

Swift 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)
    }
}

Ziel 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
Ian
quelle
Danke für den Kommentar und die Eingabe.
Richard
11
Beste Antwort. Irgendwelche Ideen, um dasselbe für die Back-Animation zu erreichen?
Thomas
1
Klappt wunderbar. Dies ist auch der "richtige" Weg, dies mit Storyboard-Segues zu tun.
Jeff Richley
1
Hat jemand die Rückanimation für die obige Antwort gestoppt.
Imran
4
Nicht DIE Lösung, der benutzerdefinierte Segue präsentiert sich über das gesamte Layout wie ein modaler Push, während der ursprüngliche Push-Segue-Fenster das Fenster ehrt ? oder ... die $ 1.000.000 Frage, wie man Animationen = NEIN spezifiziert, wenn man einen regulären Übergang mit STORYBOARDS konfiguriert
Pedro Borges
49

Sie können "Animiert" in Interface Builder für iOS 9 deaktivieren

Geben Sie hier die Bildbeschreibung ein

dtochetto
quelle
3
Dies ist die Antwort auf die ursprüngliche Frage! Andere Antworten zeigen, wie dies in objc / swift code erreicht werden kann, während dtochetto nur Xcode verwendet (wie in der ursprünglichen Frage gefordert).
Drpawelo
Für den Abwicklungsbereich scheint es jedoch nicht zu funktionieren
Nicolas Manzini
2
Dies ist die beste und schnellste Lösung, leider funktioniert dies nicht unter iOS 8.
EricH206
2
@ DanielT. Vielleicht können Sie 2 Segues auf das Storyboard ziehen, einer hat eine Animation und ein anderer hat keine Animation. Gib ihnen einen anderen IdentifierNamen.
AechoLiu
1
Beachten Sie, dass XCode dem segue-Element in der .storyboard-Datei nur ein Attribut hinzufügt. Sie können die .storyboard-Datei manuell bearbeiten und den Abschnitten, die Sie interessieren, animates = "NO" hinzufügen, wenn Sie Visual Studio verwenden und das Häkchen im Designer nicht verfügbar ist.
Wes
35

Ians Antwort funktioniert großartig!

Hier ist eine Swift-Version des Segue, falls jemand dies benötigt:

AKTUALISIERT FÜR SWIFT 5, MAI 2020

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)
    }
}
zavié
quelle
2
Wahrscheinlich aufgrund der Swift-Version brauchte ich "as!" anstelle von "as" an den beiden Stellen verwenden Sie sie.
Carlos
1
Hm vielleicht in Swift 1.2? Ich habe mit Swift 2.0 in Xcode 7 Beta1 nachgesehen und es wurde ohne Warnungen kompiliert.
Zavié
6

Ich habe es jetzt geschafft, dies mit dem folgenden Code zu tun:

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];

Hoffe das hilft jemand anderem!

Richard
quelle
Sie können dies einfach zur Aktion eines UIButton oder was auch immer hinzufügen. Wenn Sie zu einem neuen Ansichts-Controller ohne Animation springen möchten, können Sie Folgendes verwenden: - void (yourUIButtonAction) {CreditsViewController * creditspage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: creditspage animiert: NO]; }
Richard
Dies beantwortet nicht einmal die Frage. Sie verwenden hier kein Segue!
KIDdAe
4

Hier ist die Swift-Version, die angepasst wurde, um einen ViewController ohne Animation modal darzustellen:

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)
    }

}
Daniel McLean
quelle
1
Dieser Code wird aus der Antwort von @ zavié kopiert, ohne etwas hinzuzufügen, ist aber in der Tat schlimmer: Keine Überprüfung auf
Optionen
Dies unterscheidet sich von der Antwort von @ zavié, da hier gezeigt wird, wie ein ViewController ohne Animation modal dargestellt wird. Es ist schön, ihn hier als Referenz zu haben, da er in gewissem Zusammenhang mit der Frage steht.
n.Drake
2

antworte mit Swift3 -

für "Push" -Segue:

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

für "modale" Segue:

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

Für alle, die Xamarin iOS verwenden, muss Ihre benutzerdefinierte Segue-Klasse folgendermaßen aussehen:

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

    }

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

Vergessen Sie nicht, dass Sie in Ihrem Storyboard noch einen benutzerdefinierten Abschnitt festlegen und die Klasse auf die PushNoAnimationSegue-Klasse setzen müssen.

JacobK
quelle
0

Für mich ist der einfachste Weg:

UIView.performWithoutAnimation { 

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

    }

Verfügbar ab iOS 7.0

LironXYZ
quelle
Wenn Sie adaptive Segmente verwenden, werden meines Erachtens, obwohl performWithoutAnimation Animationen deaktiviert, Animationen vor dem Ausführen des Segues wieder aktiviert, wenn für das Segment "Animationen" aktiviert ist. Nach der Ausführung werden sie jedoch wieder deaktiviert, wenn dies zuvor der Fall war.
Malhal
Sie können dies jedoch umgehen, indem Sie eine UIStoryboardSegue-Unterklasse erstellen und Animationen vor der Ausführung erneut deaktivieren (z. B. mithilfe des Konstruktors prüfen, ob sie deaktiviert sind, und in einer Eigenschaft speichern).
Malhal
0

Ich verwende Visual Studio mit Xamarin und der Designer gibt in der Antwort von dtochetto kein Häkchen "Animiert" an.

Beachten Sie, dass der XCode-Designer das folgende Attribut auf das segue-Element in der .storyboard-Datei anwendet: animates = "NO"

Ich habe die .storyboard-Datei manuell bearbeitet und animates = "NO" zu den Segue-Elementen hinzugefügt, und es hat bei mir funktioniert.

Beispiel:

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

DRÜCKEN OHNE ANIMATION: Schnell Hier ist, was für mich funktioniert hat.

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)
        }
    }
}

Verwendung : Stellen Sie die Segue-Klasse wie im Bild gezeigt aus dem Storyboard ein. Setzen Sie isAnimationRequired von Ihrem Viewcontroller auf false, von wo aus Sie performSegue aufrufen möchten, wenn Sie segue ohne Animation drücken und nach dem Aufrufen von self.performSegue auf true zurücksetzen möchten. Viel Glück....

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

Stellen Sie die Segue-Klasse vom Storyboard aus wie in der Abbildung gezeigt ein.

Usman
quelle
-1

Gerade gesetzt animated falsch auf UINavigationController.pushViewControllerin Swift

self.navigationController!.pushViewController(viewController, animated: false)
Michael
quelle