Xcode'da animasyon olmadan segmenti itin


90

Normal storyboard kullanıyorum ve xcode'da segmentleri itiyorum, ancak sonraki görünümü kaydırmak yerine yalnızca bir sonraki görünümde görünen segmentlere sahip olmak istiyorum (bir sekme çubuğunu kullandığınızda ve sonraki görünümün göründüğü gibi).

Normal itme segmentlerinin, özel segmentler eklemeye gerek kalmadan sadece "görünmesini" ve "kaymamasını" sağlamanın güzel ve basit bir yolu var mı?

Her şey tamamen iyi çalışıyor, sadece görünümler arasındaki bu slayt animasyonunu kaldırmak istiyorum.


İtme segmentini modal segmente değiştirmeyi denedim, çünkü bu animasyonu kaldırmama izin verebilir, ancak üst araç çubuğuna sahip bir tablo görünümüm var ve segmenti modal olarak ayarlamak bu üst çubuğu kaldırıyor ve herhangi bir yol bulamıyorum üst çubuğu tekrar eklemek için! Bu yüzden geçişi canlandırmayan, ancak tablo görüşümü bozmayan bir çözüme ihtiyacım var.
Richard

Yanıtlar:


143

Bunu özel bir segment oluşturarak yapabildim ( bu bağlantıya göre ).

  1. Yeni bir segment sınıfı oluşturun (aşağıya bakın).
  2. Storyboard'unuzu açın ve segmenti seçin.
  3. Sınıfı PushNoAnimationSegue(veya onu adlandırmaya karar verdiğiniz şeye) ayarlayın.

Xcode'da segment sınıfını belirtin

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

Hedef 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

Yorum ve girdi için teşekkürler.
Richard

11
En iyi cevap. Arka animasyon için aynı şeyi başarmakla ilgili herhangi bir fikriniz var mı?
Thomas

1
Tıkır tıkır çalışıyor. Bu aynı zamanda bunu film şeridi bölümleriyle yapmanın "doğru" yoludur.
Jeff Richley

1
Herhangi biri yukarıdaki cevap için geri animasyonu durdurdu mu?
Imran

4
ÇÖZÜM DEĞİL, özel segment tüm düzen boyunca tıpkı bir modal itme gibi sunulur, orijinal itme segmenti ise pencereyi destekler. Çerçeve navigasyonu Kontrolör sekmesi Çubuk Kontrolör vb ... segmenti modal segment yerine itme segmenti gibi davranacak şekilde nasıl yapılandırılır ? veya ... 1.000.000 $ 'lık soru, animasyonları nasıl belirtir? = HAYIR HİKAYELERİ kullanarak normal bir segmenti yapılandırırken
Pedro Borges

50

İOS 9 için Arayüz Oluşturucu'da "Animates" seçeneğinin işaretini kaldırabilirsiniz

görüntü açıklamasını buraya girin


3
Bu, orijinal sorunun cevabı! Diğer cevaplar bunun objc / swift kodunda nasıl elde edileceğini gösterirken, dtochetto sadece Xcode kullanır (orijinal soruda talep edildiği gibi).
drpawelo

ancak gevşeme bölümü için işe yaramıyor
Nicolas Manzini

2
Bu en iyi ve en hızlı çözüm, maalesef bu iOS 8'de çalışmıyor.
EricH206

2
@DanielT. Belki film şeridinde 2 segmenti sürükleyebilirsiniz, birinde animasyon var, diğerinde animasyon yok. Onlara farklı bir Identifierisim verin .
AechoLiu

1
XCode'un .storyboard dosyasındaki segment öğesine yalnızca bir nitelik eklediğini unutmayın. Visual studio kullanıyorsanız ve tasarımcıda onay işareti yoksa, .storyboard dosyasını manuel olarak düzenleyebilir ve önem verdiğiniz bölümlere animates = "NO" ekleyebilirsiniz.
Wes

35

Ian'ın cevabı harika çalışıyor!

İşte ihtiyaç duyan biri varsa Segue'nun Swift versiyonu:

MAYIS 2020 SWIFT 5 İÇİN GÜNCELLENDİ

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
Muhtemelen Swift versiyonundan dolayı "as!" onları kullandığınız iki yerde "as" yerine.
Carlos

1
Hm belki Swift 1.2'de? Xcode 7 Beta1'de Swift 2.0 ile kontrol ettim ve herhangi bir uyarı olmadan derlendi.
zavié

6

Şimdi bunu aşağıdaki kodu kullanarak yapmayı başardım:

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

Umarım bu başka birine yardımcı olur!


Bunu bir UIButton veya her neyse eylemine ekleyebilirsiniz. Animasyon içermeyen yeni bir görünüm denetleyicisine atlamak istiyorsanız, şunları kullanabilirsiniz: - void (yourUIButtonAction) {CreditsViewController * creditspage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: creditspage animasyonlu: HAYIR]; }
Richard

Bu soruya cevap bile vermiyor. Burada segment kullanmıyorsunuz!
KIDdAe

4

İşte bir ViewController'ı animasyonsuz mod olarak sunmak için uyarlanmış Swift sürümü :

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
Bu kod @ zavié yanıttan kopyalandı, hiçbir şey eklemiyor, ama gerçekten daha kötü: isteğe bağlı seçenekler için kontrol yok
Diego Freniche

Bu, @ zavié'nin cevabından farklıdır çünkü bir ViewController'ın animasyon olmadan modal olarak nasıl sunulacağını gösterir . Soru ile biraz ilgili olduğundan burada referans olarak bulundurmak güzel.
n.Drake

2

Swift3 kullanarak cevapla -

"itme" segmenti için:

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

"modal" segment için:

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

1

Xamarin iOS kullanan herkes için özel segment sınıfınızın şöyle görünmesi gerekir:

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

    }

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

Hikaye panonuzda hala özel bir segment ayarlamanız ve sınıfı PushNoAnimationSegue sınıfına ayarlamanız gerektiğini unutmayın.


0

Sadece set animated = false üzerinde UINavigationController.pushViewControllerSwift

self.navigationController!.pushViewController(viewController, animated: false)

1
Bunun neden reddedildiğinden emin değilim. Benim için mükemmel çalıştı!
Eric

0

Benim için bunu yapmanın en kolay yolu:

UIView.performWithoutAnimation { 

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

    }

İOS 7.0'dan itibaren mevcuttur


Uyarlanabilir segmentler kullanılıyorsa, performWithoutAnimation animasyonları devre dışı bıraksa da, segment gerçekleştirilmeden önce, segment "animasyonlar" işaretliyse animasyonlar yeniden etkinleştirilir. Yaptıktan sonra, ancak daha önce olsaydı onları tekrar devre dışı bırakır.
malhal

Ancak, bir UIStoryboardSegue alt sınıfı oluşturarak ve gerçekleştirmeden önce animasyonları tekrar devre dışı bırakarak (örneğin, devre dışı bırakılıp bırakılmadıklarını kontrol etmek için yapıcıyı kullanarak ve bir özellikte depolayarak) bunu aşabilirsiniz.
malhal

0

Xamarin ile Visual Studio kullanıyorum ve tasarımcı dtochetto'nun yanıtında "Animates" onay işaretini sağlamıyor.

XCode tasarımcısının .storyboard dosyasındaki segment öğesine aşağıdaki özniteliği uygulayacağını unutmayın: animates = "NO"

.Storyboard dosyasını manuel olarak düzenledim ve segment öğelerine animasyon = "HAYIR" ekledim ve benim için çalıştı.

Misal:

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

0

ANİMASYON OLMADAN İTME: Hızlı İşte benim için işe yarayan şey.

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

Kullanım : Segue sınıfını film şeridinden resimde gösterildiği gibi ayarlayın. viewcontroller'dan isAnimationRequired değerini, performSegue'yu çağırmak istediğiniz yerden false olarak ayarlayın, animasyon olmadan segmenti itmek istediğinizde ve self.performSegue çağrıldıktan sonra tekrar true olarak ayarlayın. İyi şanslar....

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

Segue sınıfını resimde gösterildiği gibi film şeridinden ayarlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.