web-dev-qa-db-fra.com

Push segue dans xcode sans animation

J'utilise le storyboarding normal et les séquences Push dans xcode, mais je souhaite que les séquences n'apparaissent que dans la vue suivante, et non dans la vue suivante (comme lorsque vous utilisez une barre d'onglets et que la vue suivante apparaît).

Existe-t-il un moyen simple et agréable d’utiliser des séquences Push normales pour qu’elles «apparaissent» et non «glisser», sans avoir besoin d’ajouter des séquences personnalisées?

Tout fonctionne parfaitement, je veux juste supprimer cette animation de diapositive entre les vues.

88
Richard

J'ai maintenant réussi à faire cela en utilisant le code suivant:

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

J'espère que ceci aide quelqu'un d'autre!

6
Richard

Je pouvais le faire en créant une séquence personnalisée (basée sur ce lien ).

  1. Créez une nouvelle classe de segue (voir ci-dessous).
  2. Ouvrez votre scénarimage et sélectionnez le classement.
  3. Définissez la classe sur PushNoAnimationSegue (ou ce que vous avez décidé de l'appeler).

 Specify segue class 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)
    }
}

Objectif 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
140
Ian

Vous pouvez décocher "Animates" dans Interface Builder pour iOS 9.

 enter image description here

46
dtochetto

La réponse de Ian fonctionne très bien! 

Voici une version rapide de la Segue, si quelqu'un a besoin de:

PushNoAnimationSegue.Swift

import UIKit

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

    override func perform() {
        let source = sourceViewController as UIViewController
        if let navigation = source.navigationController {
            navigation.pushViewController(destinationViewController as UIViewController, animated: false)
        }
    }

}
35
zavié

Voici la version de Swift adaptée à présenter modalement un ViewController sans animation:

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

}
3
Daniel McLean

répondez en utilisant Swift3

pour "Push" segue:

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

pour "modal" segue:

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

Pour ceux qui utilisent Xamarin iOS, votre classe de division personnalisée doit ressembler à ceci:

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

    }

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

N'oubliez pas que vous devez toujours définir une séquence personnalisée dans votre story-board et définir la classe sur la classe PushNoAnimationSegue.

1
JacobK

Pour moi, le moyen le plus simple de le faire est:

UIView.performWithoutAnimation { 

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

    }

Disponible depuis iOS 7.0

0
LironXYZ

J'utilise Visual Studio w/Xamarin, et le concepteur ne fournit pas la coche "Animates" dans la réponse de dtochetto.

Notez que le concepteur XCode appliquera l'attribut suivant à l'élément segue du fichier .storyboard: animates = "NO"

J'ai édité manuellement le fichier .storyboard et ajouté animates = "NO" aux éléments de séquence, et cela a fonctionné pour moi.

Exemple:

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

Push WITHOUT ANIMATION: Swift Voici ce qui a fonctionné pour moi.

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

Usage: définissez la classe de transition à partir du storyboard, comme indiqué dans l'image. définissez la propriété isAnimationRequired de votre contrôleur de vue sur false à partir de l'endroit où vous souhaitez appeler performSegue, lorsque vous souhaitez pousser la séquence sans animation et redéfinir sur true après l'appel de self.performSegue. Bonne chance....

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

 set the segue class from storyboard as shown in picture.

0
Usman