Saya menggunakan storyboard normal dan mendorong segues di xcode, tetapi saya ingin memiliki segues yang hanya muncul di tampilan berikutnya, bukan menggeser tampilan berikutnya (seperti saat Anda menggunakan bilah tab dan tampilan berikutnya baru saja muncul).
Adakah cara sederhana yang bagus agar segmen dorong normal hanya "muncul" dan bukan "geser", tanpa perlu menambahkan segmen khusus?
Semuanya bekerja dengan baik, saya hanya ingin menghapus animasi slide di antara tampilan.
Jawaban:
Saya dapat melakukan ini dengan membuat segue khusus (berdasarkan tautan ini ).
PushNoAnimationSegue
(atau apa pun yang Anda putuskan untuk menyebutnya).Cepat 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) } }
Tujuan 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
sumber
Anda dapat menghapus centang "Animasi" di Interface Builder untuk iOS 9
sumber
Identifier
nama yang berbeda .Jawaban Ian sangat bagus!
Berikut adalah Segue versi Swift, jika ada yang membutuhkan:
DIPERBARUI UNTUK SWIFT 5, MEI 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) } }
sumber
Sekarang saya telah berhasil melakukan ini menggunakan kode berikut:
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];
Semoga ini bisa membantu orang lain!
sumber
Berikut versi Swift yang diadaptasi untuk secara sederhana menyajikan ViewController tanpa animasi:
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) } }
sumber
jawab menggunakan Swift3 -
untuk segue "push":
class PushNoAnimationSegue: UIStoryboardSegue { override func perform() { source.navigationController?.pushViewController(destination, animated: false) } }
untuk segue "modal":
class ModalNoAnimationSegue: UIStoryboardSegue { override func perform() { self.source.present(destination, animated: false, completion: nil) } }
sumber
Bagi siapa pun yang menggunakan Xamarin iOS, kelas segue khusus Anda harus terlihat seperti ini:
[Register ("PushNoAnimationSegue")] public class PushNoAnimationSegue : UIStoryboardSegue { public PushNoAnimationSegue(IntPtr handle) : base (handle) { } public override void Perform () { SourceViewController.NavigationController.PushViewController (DestinationViewController, false); } }
Jangan lupa Anda masih perlu mengatur segmen khusus di papan cerita Anda dan mengatur kelas ke kelas PushNoAnimationSegue.
sumber
Bagi saya, cara termudah untuk melakukannya adalah:
UIView.performWithoutAnimation { self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil) }
Tersedia dari iOS 7.0
sumber
Saya menggunakan Visual Studio w / Xamarin, dan desainer tidak memberikan tanda centang "Animasi" dalam jawaban dtochetto.
Perhatikan bahwa desainer XCode akan menerapkan atribut berikut ke elemen segue di file .storyboard: animates = "NO"
Saya secara manual mengedit file .storyboard dan menambahkan animates = "NO" ke elemen segue, dan itu berhasil untuk saya.
Contoh:
<segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>
sumber
DORONG TANPA ANIMASI: Cepat Inilah yang berhasil untuk saya.
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) } } }
Penggunaan : Atur kelas segue dari storyboard seperti yang ditunjukkan pada gambar. setel isAnimationRequired dari viewcontroller Anda ke false dari tempat Anda ingin memanggil performSegue, saat Anda ingin mendorong segue tanpa animasi dan menyetel kembali ke true setelah memanggil self.performSegue. Semoga berhasil....
DispatchQueue.main.async { self.isAnimationRequired = false self.performSegue(withIdentifier: "showAllOrders", sender: self); self.isAnimationRequired = true }
sumber
Hanya mengatur
animated
palsu diUINavigationController.pushViewController
di Swiftself.navigationController!.pushViewController(viewController, animated: false)
sumber