Spingi segue in xcode senza animazione


90

Sto usando il normale storyboard e push segues in xcode, ma voglio che i segues appaiano solo nella vista successiva, non far scorrere la vista successiva (come quando usi una barra delle schede e la vista successiva appare solo).

Esiste un modo semplice e carino per fare in modo che le sequenze push normali "appaiano" e non "scivolino", senza la necessità di aggiungere segues personalizzate?

Tutto funziona perfettamente, voglio solo rimuovere l'animazione della diapositiva tra le viste.


Ho appena provato a cambiare il segue push in un segue modale, in quanto ciò può consentirmi di rimuovere l'animazione, ma ho una tableview con una barra degli strumenti in alto e l'impostazione del segue su modale rimuove questa barra in alto e non riesco a trovare alcun modo per aggiungere nuovamente la barra in alto! Quindi ho bisogno di una soluzione che non animi la transizione, ma non interrompa la mia vista tabella.
Richard

Risposte:


143

Sono stato in grado di farlo creando un segue personalizzato (basato su questo collegamento ).

  1. Crea una nuova classe Segue (vedi sotto).
  2. Apri il tuo Storyboard e seleziona il segue.
  3. Imposta la classe su PushNoAnimationSegue(o come hai deciso di chiamarla).

Specificare la classe segue in Xcode

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

Obiettivo 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

Grazie per il commento e l'input.
Richard

11
Migliore risposta. Qualche idea per ottenere lo stesso risultato per l'animazione posteriore?
Thomas,

1
Funziona come un fascino. Questo è anche il modo "corretto" di farlo con lo storyboard.
Jeff Richley

1
Qualcuno ha interrotto l'animazione posteriore per la risposta precedente.
Imran

4
Non LA soluzione, il segue personalizzato si presenta sull'intero layout proprio come un push modale mentre il segue push originale onora window.frame navigationController tabBarController ecc ... come si configura il segue in modo che si comporti come un segue push invece che come un segue modale ? oppure ... la domanda da $ 1.000.000, come si specificano le animazioni = NO quando si configura un segue regolare utilizzando STORYBOARDS
Pedro Borges

49

Puoi deselezionare "Animate" in Interface Builder per iOS 9

inserisci qui la descrizione dell'immagine


3
Questa è la risposta alla domanda originale! Altre risposte mostrano come ottenere questo in objc / swift code, mentre dtochetto utilizza solo Xcode (come richiesto nella domanda originale).
drpawelo

tuttavia per lo svolgimento segue non sembra funzionare
Nicolas Manzini

2
Questa è la soluzione migliore e più veloce, purtroppo non funziona su iOS 8.
EricH206

2
@DanielT. Forse puoi trascinare 2 segue sullo storyboard, uno ha l'animazione e un altro non ha animazione. Dai loro un Identifiernome diverso .
AechoLiu

1
Nota che XCode aggiunge solo un attributo all'elemento segue nel file .storyboard. Puoi modificare manualmente il file .storyboard e aggiungere animates = "NO" ai segues che ti interessano se stai usando Visual Studio e il segno di spunta non è disponibile nel designer.
Wes

35

La risposta di Ian funziona alla grande!

Ecco una versione Swift del Segue, se qualcuno ha bisogno:

AGGIORNATO PER SWIFT 5 MAGGIO 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)
    }
}

2
Probabilmente a causa della versione Swift, avevo bisogno di "as!" invece di "come" nei due posti in cui li usi.
Carlos

1
Hm forse in Swift 1.2? Ho controllato con Swift 2.0 in Xcode 7 Beta1 e si è compilato senza alcun avviso.
zavié

6

Ora sono riuscito a farlo utilizzando il seguente codice:

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

Spero che questo aiuti qualcun altro!


Puoi semplicemente aggiungerlo all'azione di un UIButton o qualsiasi altra cosa. Se desideri passare a un nuovo controller di visualizzazione senza animazione, puoi utilizzare: - void (yourUIButtonAction) {CreditsViewController * creditspage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: creditspage animated: NO]; }
Richard

Questo non è nemmeno rispondere alla domanda. Non stai usando Segue qui!
KIDdAe

4

Ecco la versione Swift adattata per presentare modalmente un ViewController senza animazione:

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
Questo codice è copiato da @ zavié answer, senza aggiungere nulla, ma anzi è peggio: nessun controllo per optionals incluso
Diego Freniche

Questo è diverso dalla risposta di @ zavié perché mostra come presentare in modo modale un ViewController senza animazione. È bello averlo qui come riferimento poiché è in qualche modo correlato alla domanda.
Drake

2

rispondi usando Swift3 -

per "push" segue:

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

per "modale" segue:

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

1

Per chiunque utilizzi Xamarin iOS, la classe Segue personalizzata deve avere questo aspetto:

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

    }

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

Non dimenticare che devi ancora impostare un segue personalizzato nello storyboard e impostare la classe sulla classe PushNoAnimationSegue.


0

Per me, il modo più semplice per farlo è:

UIView.performWithoutAnimation { 

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

    }

Disponibile da iOS 7.0


Se si utilizzano le sequenze adattive, credo che anche se performWithoutAnimation imposti le animazioni disabilitate, prima che venga eseguita la sequenza, le animazioni vengono nuovamente attivate se segue "si anima". Dopo l'esecuzione, li disabilita comunque nuovamente se lo erano in precedenza.
malhal

Ma puoi aggirare il problema creando una sottoclasse UIStoryboardSegue e disabilitando nuovamente le animazioni prima dell'esecuzione (ad esempio usando il costruttore per verificare se sono disabilitate e memorizzandole in una proprietà).
malhal

0

Sto usando Visual Studio con Xamarin e il designer non fornisce il segno di spunta "Animate" nella risposta di dtochetto.

Tieni presente che il designer XCode applicherà il seguente attributo all'elemento segue nel file .storyboard: animates = "NO"

Ho modificato manualmente il file .storyboard e aggiunto animates = "NO" all'elemento segue, e per me ha funzionato.

Esempio:

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

0

PUSH SENZA ANIMAZIONE: Swift Ecco cosa ha funzionato per me.

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

Utilizzo : imposta la classe Segue dallo storyboard come mostrato nell'immagine. imposta isAnimationRequired dal tuo viewcontroller su false da dove vuoi chiamare performSegue, quando vuoi spingere segue senza animazione e tornare a true dopo aver chiamato self.performSegue. Buona fortuna....

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

imposta la classe Segue dallo storyboard come mostrato nell'immagine.


-1

Basta impostare animated falso su UINavigationController.pushViewControllera Swift

self.navigationController!.pushViewController(viewController, animated: false)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.