Soru Swift'deki hareketi geri kaydırmayı devre dışı bırak


Bir süredir buralarda gezindim ama çalışma çözümü bulamıyor gibi görünüyor.

Swift'de önceki görünüm hareketine dönmek için kaydırmayı devre dışı bırakmaya çalışıyorum.

Dahil olmak üzere çeşitli çözümler denedim:

self.navigationController?.interactivePopGestureRecognizer.enabled = false

ve

self.navigationController.interactivePopGestureRecognizer.delegate = self

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
    return false;
}

Bu ya da çalışan başka bir yöntem yapmak için yeni bir yöntem var mı?


44
2017-07-30 18:48


Menşei


Lütfen devre dışı bırakmayın. Uygulamalar devre dışı bırakıldığında nefret ediyorum. - Aaron Brager
Bir kullanıcı tam olarak kaydırmadığında ve kullanmakta olduğumuz kullanıcı arayüzünün doğasına müdahale ettiğinde (ses kaydında zaman aramak) bir soruna neden oluyor - Phil Hudson
Peki, sorunuzu rayından çıkarmak istemiyorum, ama size (1) tam-tokatlamak sorununu çözmenizi ve (2) ses parçanızın UI'yi aramasını tavsiye ederim, böylece bu kadar yakın olmasın. Bu UX bekleniyor, ve özellikle iPhone 6 Plus ve iPad kullanıcıları için özellikle navigasyon çubuğuna ulaşmak için bir güçlük var. - Aaron Brager
Her neyse, kodunuz jest tanıyıcıyı devre dışı bırakmalıdır. İOS'un eski sürümlerinde çalışır mı? - Aaron Brager
Ah iPhone 6 hakkında iyi bir nokta - belki de dealloc yöntemini değiştirmeye bakacağım - ama yine de yine de ilgilendiğim gibi soruyu açık bırakacağım - Phil Hudson


Cevaplar:


Bunu devre dışı bırakabilirdiniz, ancak çoğu iOS kullanıcısı geri düğmeyi kullanarak hızlıca kaydırıp daha hızlı geri dönerek önerilmemektedir. Eğer devre dışı bırakmak istiyorsanız, bir modal segue bir aktarım yerine o kadar büyük olmayan bir itme kolu yerine. Eğer gerçekten geri gitmek için tokatlamaktan kurtulmak istiyorsanız geri düğmeyi devre dışı bırakabilirim ve ekranın sağ üst kısmında bitti düğmesi var.

self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;

8
2017-07-30 19:07





Aşağıda, kaydırmanın geri alınması ve yeniden etkinleştirilmesi için kolay bir yaklaşım sunulmaktadır.

Swift 3.x ve üstü

Bir viewDidLoad / willAppear / didAppear yönteminde şunu ekleyin:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

Sadece şunu aklınızdan çıkarmayın: viewDidLoaddaha sonra görünümü bir sonraki açışınızda, yığında kalıp kalmamaya bağlı olarak ayarlanmayabilir.

Görüntülemenin kapalı kalmasını istemediğiniz sürece, görünüm ya da willMove(toParentViewController:) veya willDisappear. Sizin navigationController sıfır olacak viewDidDisappearYani çok geç oldu.

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

Özel bir not SplitViewControllers:

CompC tarafından yorumlarda belirtildiği gibi, ikinci gezinme denetleyicisini, aşağıdaki gibi bir ayrıntı görünümüne uygulamak için çağırmanız gerekir:

navigationController?.navigationController?.interactivePopGe‌​stureRecognizer?.isE‌​nabled = false

Hızlı 2.2 ve Amaç-C

Swift sürümleri 2.x ve aşağısı:

navigationController?.interactivePopGestureRecognizer?.enabled

Objective-C:

self.navigationController.interactivePopGestureRecognizer.enabled

85
2017-08-05 16:28



Bunu yapmak için biraz sıkıntı çekiyordum, fark ettim ki, denetleyici bunu devre dışı bırakmak için Split View Controller'ın detay tarafındaydı, teknik olarak ayrı bir navigasyon kontrol cihazında (ne zaman çöktü, aynı denetleyicide olduğu gibi görünüyor). Bunu aşmak için yapmak zorundaydım: navigationController?.navigationController?.interactivePopGestureRecognizer?.isEnabled = false - CompC
@CompC Güncelleme için teşekkürler, asla bu senaryoyu, bilmesi çok iyi olmadı. - CodeBender
didAppear'da devre dışı bırakmak ve yeniden etkinleştirmek için yeterlidir. Özellikle yeniden etkinleştirin didDisappear işe yaramaz, çünkü navigationController özelliği zaten sıfırdır. - Vilém Kurz
Teşekkürler Bu Doğru Cevap olmalı - Hernan Arber
@ iajmeri43 Evet, UINavigationController alt sınıfını oluşturun ve özelliği viewDidLoad öğesinde ayarlayın. Nav denetleyicisi uygulama içinde istediğiniz tüm görünümler tarafından kullanıldığı sürece, işe yarayacaktır. - CodeBender


Bunu yanlış bir şekilde döndürerek harekete geçirdim .RecognizerShouldBegin

class ViewController2: UIViewController, UIGestureRecognizerDelegate {
...
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.navigationController?.interactivePopGestureRecognizer.delegate = self
}

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

17
2017-07-30 19:08



Not UIGestureRecognizer! OP'nin kodunda UIGestureRecognizer İşte. - Aaron Brager


Hari ya da Stefan'ın cevabıyla ilgili yanlış bir şey yok ama bu daha özlü. Sadece viewDidLoad'a koy ve işin bitti.

if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
    navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
}

DÜZENLE:

Bir küçük uyarı, Navigasyon Kontrolörünün başka bir görünüm tarafından açılmış olması ve Navigasyon Kontrolörünün kapalı olması durumunda bir EXC_BAD_ACCESS hatası elde edersiniz. Düzeltmek için orijinal UIGestureRecognizer'ı kaydetmeli ve görünümden çıktığınızda geri koyun.

Bildirmek:

private var popGesture: UIGestureRecognizer?

Bu hareketi kaldırmadan hemen önce:

popGesture = navigationController!.interactivePopGestureRecognizer

Sonra görünümü kapatırken:

If popGesture != nil {
    navigationController!.view.addGestureRecognizer(popGesture!)
}

5
2017-08-29 06:18



Bu bir charme gibi çalıştı - David Seek


objektif için -c

-(void)viewWillAppear:(BOOL)animated{
  [super viewWillAppear:true];

  self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}

3
2018-02-17 11:12





Genel olarak, geçiş ekranının mümkün olduğunca çok yerde etkinleştirildiğinden emin olun, hatta kalıcı ekranlara eklemek için özel bir jest tanıyıcı ekleyerek bile. Ancak, uygulamamdaki bir kimlik doğrulama ve indirme işlemi için, işlemi bir modal gezinme denetleyicisi ile başlatıyorum ve daha sonra her bir sonraki adım için görünümü zorluyorum. Ancak, tamamlandığında, bunların kimlik doğrulama ekranlarına yedeklemelerini önlemek istiyorum.

Kullanmakta olduğum bu senaryo için:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true

içinde viewWillAppear() son ekranda. Bunları geri alabilirsiniz viewWillDisappear() başka bir görüntüyü bastırıyor ve onlara ihtiyacınız varsa.


2
2017-10-06 19:09





RowanPD'nin mantığı Swift 4

private var popGesture: UIGestureRecognizer?

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if navigationController!.responds(to: #selector(getter: UINavigationController.interactivePopGestureRecognizer)) {
        self.popGesture = navigationController!.interactivePopGestureRecognizer
        self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!)
    }

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let gesture = self.popGesture {
        self.navigationController!.view.addGestureRecognizer(gesture)
    }

}

1
2017-09-29 05:41