2013-09-22 15 views
15

Quindi ho un controller di navigazione nel mio costruito per iOS 7 app. Il titleView è visibile, così come il pulsante indietro e la barra di navigazione. Per qualche ragione, il gesto pop interattivo (scorrere dal bordo sinistro) non funziona. Non accade nulla. Quando registro il gesto, non è nulla. C'è qualcosa di speciale che devo fare per abilitare questa funzionalità? Cosa potrebbe far sì che non funzioni?UINavigationController Interactive Pop Gesture non funziona?

risposta

25

Eh, sembra che ho dovuto impostare il delegato gesto e mettere in atto le seguenti:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return YES; 

} 
+0

Ive ha verificato questo, ma problema molto inquietante, quando ho questa fissa quindi se l'utente scorre a metà strada e poi torna indietro vedo il controller successivo sovrapposto al controller della vista precedente. Vedo il controller della vista precedente e il successivo è trasparente come vetro trasparente.Quindi l'utente sembra essere bloccato in questo stato. Qualche idea. Questo è qualcosa Vista apparirà/apparirà problema di gestione. –

12

si può mettere questa riga nel metodo diviewDidLoad.

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 
+0

10 ha funzionato per me .. Grazie a – Simmy

15

Guarda questo response e commenti. Tutto quello che dovete fare è impostare delegato interattivo pop gesto di riconoscitore del controller di navigazione per nil:

self.navigationController.interactivePopGestureRecognizer.delegate = nil; 

Impostandola a un auto pressofuso per id<UIGestureRecognizerDelegate> funziona anche perché tutti i metodi nel protocollo sono opzionali, ma credo che l'impostazione del delegato a nil è più appropriato in questo caso.

+1

ho avuto successo solo con questo in ViewDidAppear – jonbauer

+6

Questo "funziona" ma poco dopo causa problemi molto strani fino al punto di congelare l'app (testata con iOS 8, dispositivo) – Ixx

5

La risposta più elaborato era sia Aaron e lojals

Prima di personalizzare il controller di navigazione e poi inserire questo codice nella classe

In viewDidLoad messo questa linea:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 

E in classe scrivere questa funzione

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;} 
18

Ho trovato th quando usi i pulsanti personalizzati, il gesto pop interattivo smette di funzionare (la mia opinione è che Apple non può prevedere come si comporterà il tuo pulsante back personalizzato, quindi disabiliterà il gesto).

Per risolvere questo problema, come già menzionato in precedenza, è possibile impostare la proprietà interactivePopGestureRecognizer.delegate su nil.

In Swift, questo può essere fatto facilmente in tutta l'intera applicazione con l'aggiunta di un'estensione per UINavigationController come questo:

extension UINavigationController { 

    override public func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = nil 
    } 

} 

risposta Aggiornato

Sembra come impostare il delegato alla nil cause l'interfaccia utente dell'applicazione si blocca in alcuni scenari (ad esempio quando l'utente fa scorrere verso sinistra o destra sul controller della vista superiore dello stack di navigazione).

Perché gestureRecognizerShouldBegin metodo delegato non può essere gestito in un interno, sottoclasse UINavigationController sembra la soluzione migliore:

class NavigationController: UINavigationController, UIGestureRecognizerDelegate { 

    /// Custom back buttons disable the interactive pop animation 
    /// To enable it back we set the recognizer to `self` 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = self 
    } 

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     return viewControllers.count > 1 
    } 

} 
+3

Questo sembra funzionare, ma si scopre che in determinate circostanze congela l'app. Penso che accada quando viene attivato il gesto pop interattivo mentre viene premuto un controller di visualizzazione. Un modo più sicuro sarebbe quello di sottoclasse 'UINavigationController'. Nella sottoclasse, imposta l'opzione 'interactivePopGestureRecognizer.delegate' e previene che il gesto pop interattivo venga riconosciuto mentre viene premuto un nuovo controller di visualizzazione. – joern

+0

Infatti, ho riscontrato che anche questo problema sembra influenzare solo il controller di visualizzazione superiore dello stack del controller di navigazione. Ho aggiornato la mia risposta con una soluzione diversa basata sulla sottoclasse. –

+0

@Eneko Alonso perfetto! Proprio come hai detto, se l'utente fa scorrere verso sinistra o verso destra e poi tocca un pulsante, il controller di visualizzazione push viene visualizzato in modo errato. La sottoclasse risolve il problema al 100% – Alex

Problemi correlati