Ci sono state domande simili prima e ho fatto riferimento a Capturing touches on a subview outside the frame of its superview using hitTest:withEvent: e Delivering touch events to a view outside the bounds of its parent view. Ma non sembrano rispondere al mio particolare problema.Ricezione di eventi di tocco fuori limite
Ho un controllo personalizzato con la seguente struttura:
+-------------------------------+
| UIButton |
+-------------------------------+
| |
| |
| UITableView |
| |
| |
+------------------------- +
Il controllo personalizzato sostituisce il UIButton
sottoclasse e aggiunge il UITableView
come visualizzazione secondaria. L'idea è di avere l'intero controllo come un dropdown. Quando si preme UIButton
, verrà visualizzato il menu a discesa UITableView
e sarà possibile selezionare una scelta.
Questo tutto funziona bene con il hitTest
sottoposto a override in UIButton
come descritto in Q & di Apple un link qui sopra, se il controllo è un figlio diretto del più alto UIView
. Tuttavia, se il controllo si trova in un'altra gerarchia di viste, UITableView
non riceve gli eventi di tocco.
Quello che segue è il codice hitTest utilizzato:
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
// Convert the point to the target view's coordinate system.
// The target view isn't necessarily the immediate subview
let pointForTargetView = self.spinnerTableView.convertPoint(point, fromView:self)
if (CGRectContainsPoint(self.spinnerTableView.bounds, pointForTargetView)) {
// The target view may have its view hierarchy,
// so call its hitTest method to return the right hit-test view
return self.spinnerTableView.hitTest(pointForTargetView, withEvent:event);
}
return super.hitTest(point, withEvent: event)
}
Edit:
mi scuso per non essere stato in grado di guardare le risposte e verificare se si risolve il problema, a causa di qualche altri compiti che richiedono attenzione immediata. Li controllerò e ne accetterò uno che aiuti. Grazie per la vostra pazienza.
No, il problema con l'implementazione precedente era che il punto non era stato convertito correttamente nel sistema di coordinate 'UITableView'. Quindi anche nel caso precedente, 'CGRectContainsPoint' non identifica il punto in cui si trovano i limiti di' UITableView'. – Rajesh
Ho aggiornato la mia risposta, spero che aiuterete. –
Grazie, ma ho bisogno di un modo generico per farlo. Indipendentemente dal numero di livelli gerarchici in cui si trova il controllo. – Rajesh