Abbiamo riscontrato questo problema quando si implementa il licenziamento interattivo di un controller di visualizzazione modale (trascinando il modale verso il basso dovrebbe chiuderlo) tramite UIPercentDrivenInteractiveTransition
.Errore durante la rimozione interattiva del modal
Setup:
- configurazione
UIViewController
incorporato inUINavigationController
con almeno un pulsante nellaUINavigationBar
- modale presentare un altro
UIViewController
incorporato inUINavigationController
con almeno un pulsante nellaUINavigationBar
- configurazione
UIPanGestureRecognizer
su modaly presentatoUINavigationController
per guidareUIPercentDrivenInteractiveTransition
- trascinamento modale wn "holding" che dal punto
UINavigationBar
di Interesse:
mentre lentamente trascinando verso il basso, glitch animazione causando vista modale a saltare su e giù
problema tecnico appare solo quando:
- entrambi
UINavigationBar
s hanno almeno un pulsante su di essi - si "Hold" modale il punto sulla
UINavigationBar
- entrambi
Esempio minimo può essere scaricato dal github repo.
Qualcuno si è imbattuto in un problema simile? Ci sono soluzioni alternative? C'è qualche difetto nella nostra configurazione?
Aggiornamento
problema è stato simulato a correre progetto di cui sopra su iPhone 5 simulatore con iOS 9.3
, OSX 10.11.4
, compilato con Xcode 7.3.1
.
Update 2
Ulteriori indagini hanno dimostrato, che il problema non è probabilmente in animazione: Per qualche motivo in data configurazione pan.translationInView(view)
sta tornando valori imprevisti che fa sì che l'animazione per saltare.
soluzione parziale
da un'idea di Vladimir abbiamo parzialmente risolto il problema ridefinendo hitTest
metodo UINavigationBar
:
class DraggableNavigationBar: UINavigationBar {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
guard let view = super.hitTest(point, withEvent: event) else { return nil }
if view is UIControl || pointIsInsideNavigationButton(point) {
return view
} else {
return nil
}
}
private func pointIsInsideNavigationButton(point: CGPoint) -> Bool {
return subviews
.filter { $0.frame.contains(point) }
.filter { String($0.dynamicType) == "UINavigationItemButtonView" }
.isEmpty == false
}
}
Lavori per me. Non riesco a vedere nessun problema sul mio iPhone 6 o su iOS Simulator per iPhone 6. –
NESSUN problema nel codice precedente.lavoro come charms – iMHitesh
può condividere il problema esatto con me.Quale tipo di OS e versione xCode e target di implementazione ecc. – iMHitesh