Dorong segue di xcode tanpa animasi


90

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.


Saya baru saja mencoba mengubah segue dorong menjadi segue modal, karena itu dapat membuat saya menghapus animasi, tetapi saya memiliki tampilan tabel dengan bilah alat atas, dan mengatur segue ke modal menghapus bilah atas ini, dan saya tidak dapat menemukan cara apa pun untuk menambahkan kembali bilah atas! Jadi saya membutuhkan solusi yang tidak menganimasikan transisi, tetapi tidak merusak tampilan tabel saya.
Richard

Jawaban:


143

Saya dapat melakukan ini dengan membuat segue khusus (berdasarkan tautan ini ).

  1. Buat kelas segue baru (lihat di bawah).
  2. Buka Storyboard Anda dan pilih segue.
  3. Atur kelas menjadi PushNoAnimationSegue(atau apa pun yang Anda putuskan untuk menyebutnya).

Tentukan kelas segue di Xcode

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

Terimakasih atas komentar dan masukannya.
Richard

11
Jawaban Terbaik. Adakah ide untuk mencapai hal yang sama untuk animasi belakang?
Thomas

1
Bekerja seperti pesona. Ini juga merupakan cara yang "benar" untuk melakukannya dengan segmen storyboard.
Jeff Richley

1
Apakah ada yang menghentikan animasi belakang untuk jawaban di atas.
Imran

4
Bukan solusinya, custom segue hadir di seluruh tata letak seperti modal push sementara push segue asli menghormati window.frame navigationController tabBarController dll ... bagaimana cara mengkonfigurasi segue agar berperilaku seperti push segue bukan seperti modal segue ? atau ... pertanyaan $ 1.000.000, bagaimana seseorang menentukan animasi = TIDAK saat mengkonfigurasi segue biasa menggunakan STORYBOARDS
Pedro Borges

49

Anda dapat menghapus centang "Animasi" di Interface Builder untuk iOS 9

masukkan deskripsi gambar di sini


3
Ini adalah jawaban dari pertanyaan awal! Jawaban lain menunjukkan bagaimana mencapai ini dalam kode objc / swift, sementara dtochetto hanya menggunakan Xcode (seperti yang diminta dalam pertanyaan asli).
drpawelo

namun untuk sesi santai sepertinya tidak berhasil
Nicolas Manzini

2
Ini adalah solusi terbaik dan tercepat, sayangnya ini tidak berfungsi di iOS 8.
EricH206

2
@Daniel. Mungkin, Anda dapat menyeret 2 segmen di storyboard, satu memiliki animasi, dan yang lainnya tidak memiliki animasi. Beri mereka Identifiernama yang berbeda .
AechoLiu

1
Perhatikan bahwa XCode hanya menambahkan atribut ke elemen segue di file .storyboard. Anda dapat mengedit file .storyboard secara manual dan menambahkan animates = "NO" ke segmen yang Anda pedulikan jika Anda menggunakan studio visual dan tanda centang tidak tersedia di desainer.
Wes

35

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

2
Mungkin karena versi Swift, saya membutuhkan "sebagai!" alih-alih "sebagai" di dua tempat Anda menggunakannya.
Carlos

1
Hm mungkin di Swift 1.2? Saya memeriksa dengan Swift 2.0 di Xcode 7 Beta1 dan itu dikompilasi tanpa peringatan apa pun.
zavié

6

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!


Anda bisa menambahkan ini ke tindakan UIButton atau apa pun. Jika Anda ingin melompat ke pengontrol tampilan baru tanpa animasi, Anda dapat menggunakan: - void (yourUIButtonAction) {CreditsViewController * creditpage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: animasi creditpage: NO]; }
Richard

Ini bahkan tidak menjawab pertanyaan itu. Anda tidak menggunakan segue di sini!
KIDdAe

4

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

}

1
Kode ini disalin dari jawaban @ zavié, tidak menambahkan apa-apa, tetapi memang lebih buruk: tidak ada centang untuk pilihan yang disertakan
Diego Freniche

Hal ini berbeda dari jawaban @ zavié ini karena menunjukkan bagaimana modally menyajikan ViewController tanpa animation.Nice untuk memilikinya di sini sebagai referensi karena ini agak terkait dengan pertanyaan.
n.Drake

2

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

1

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.


0

Bagi saya, cara termudah untuk melakukannya adalah:

UIView.performWithoutAnimation { 

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

    }

Tersedia dari iOS 7.0


Jika menggunakan segmen adaptif, saya yakin meskipun animasi set performWithoutAnimation dinonaktifkan, sebelum segue dijalankan, animasi diaktifkan lagi jika segue telah "menganimasikan" diperiksa. Setelah melakukan, Namun itu menonaktifkannya lagi jika sebelumnya.
malhal

Tetapi Anda dapat mengatasinya dengan membuat subkelas UIStoryboardSegue dan menonaktifkan animasi lagi sebelum perform (misalnya menggunakan konstruktor untuk memeriksa apakah mereka dinonaktifkan dan menyimpannya dalam properti).
malhal

0

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"/>

0

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
            }

atur kelas segue dari storyboard seperti terlihat pada gambar.


-1

Hanya mengatur animated palsu di UINavigationController.pushViewControllerdi Swift

self.navigationController!.pushViewController(viewController, animated: false)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.