Używam normalnych scenorysów i wypychania płynów w xcode, ale chcę, aby sekcje pojawiały się po prostu w następnym widoku, a nie przesuwały następnego widoku (tak jak w przypadku korzystania z paska kart i po prostu pojawia się następny widok).
Czy istnieje prosty sposób na to, aby zwykłe segmenty wypychania po prostu „pojawiały się”, a nie „ślizgały”, bez konieczności dodawania niestandardowych segmentów?
Wszystko działa całkowicie dobrze, chcę tylko usunąć animację slajdu między widokami.
Odpowiedzi:
Udało mi się to zrobić, tworząc niestandardową kolejkę (na podstawie tego linku ).
PushNoAnimationSegue
(lub jakkolwiek ją nazwałeś).Szybki 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) } }
Cel 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
źródło
Możesz odznaczyć „Animacje” w Interface Builder dla iOS 9
źródło
Identifier
imię.Odpowiedź Iana działa świetnie!
Oto szybka wersja Segue, jeśli ktoś potrzebuje:
ZAKTUALIZOWANO DO SWIFT 5, MAJ 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) } }
źródło
Teraz udało mi się to zrobić za pomocą następującego kodu:
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];
Mam nadzieję, że to pomoże komuś innemu!
źródło
Oto wersja Swift przystosowana do modalnego prezentowania ViewController bez animacji:
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ódło
odpowiedz używając Swift3 -
dla „wypychania” segue:
class PushNoAnimationSegue: UIStoryboardSegue { override func perform() { source.navigationController?.pushViewController(destination, animated: false) } }
dla przejścia „modalnego”:
class ModalNoAnimationSegue: UIStoryboardSegue { override func perform() { self.source.present(destination, animated: false, completion: nil) } }
źródło
Dla każdego, kto korzysta z platformy Xamarin iOS, Twoja niestandardowa klasa płynna musi wyglądać następująco:
[Register ("PushNoAnimationSegue")] public class PushNoAnimationSegue : UIStoryboardSegue { public PushNoAnimationSegue(IntPtr handle) : base (handle) { } public override void Perform () { SourceViewController.NavigationController.PushViewController (DestinationViewController, false); } }
Nie zapominaj, że nadal musisz ustawić niestandardową ścieżkę w swojej tablicy scenariuszy i ustawić klasę na klasę PushNoAnimationSegue.
źródło
Dla mnie najłatwiej to zrobić:
UIView.performWithoutAnimation { self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil) }
Dostępne od iOS 7.0
źródło
Używam programu Visual Studio w / Xamarin, a projektant nie zapewnia znacznika wyboru „Animates” w odpowiedzi dtochetto.
Zwróć uwagę, że projektant XCode zastosuje następujący atrybut do elementu płynnego w pliku .storyboard: animates = "NIE"
Ręcznie wyedytowałem plik .storyboard i dodałem animates = "NIE" do elementu (ów) płynnych i to zadziałało.
Przykład:
<segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>
źródło
PUSH BEZ ANIMACJI: Swift Oto, co zadziałało dla mnie.
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) } } }
Użycie : Ustaw klasę płynną z serii ujęć, jak pokazano na rysunku. ustaw isAnimationRequired z kontrolera widoku na false z miejsca, w którym chcesz wywołać performSegue, gdy chcesz wypchnąć płynnie bez animacji i ustawić z powrotem na true po wywołaniu self.performSegue. Powodzenia....
DispatchQueue.main.async { self.isAnimationRequired = false self.performSegue(withIdentifier: "showAllOrders", sender: self); self.isAnimationRequired = true }
źródło
Wystarczy ustawić
animated
false naUINavigationController.pushViewController
w Swiftself.navigationController!.pushViewController(viewController, animated: false)
źródło