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.
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!
Je pouvais le faire en créant une séquence personnalisée (basée sur ce lien ).
PushNoAnimationSegue
(ou ce que vous avez décidé de l'appeler).import UIKit
/*
Move to the next screen without an animation.
*/
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
self.source.navigationController?.pushViewController(self.destination, animated: false)
}
}
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
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)
}
}
}
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)
}
}
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)
}
}
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.
Pour moi, le moyen le plus simple de le faire est:
UIView.performWithoutAnimation {
self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)
}
Disponible depuis iOS 7.0
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"/>
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
}