Pojawiły się podobne pytania wcześniej i odniosłem się do Capturing touches on a subview outside the frame of its superview using hitTest:withEvent: i Delivering touch events to a view outside the bounds of its parent view. Ale nie wydają się odpowiadać na mój szczególny problem.Otrzymywanie zdarzeń dotykowych poza granicami
Mam niestandardowego formantu o następującej strukturze:
+-------------------------------+
| UIButton |
+-------------------------------+
| |
| |
| UITableView |
| |
| |
+------------------------- +
Kontrola zwyczaj nadpisuje UIButton
podklasy i dodaje UITableView
jako swój podrzędny. Chodzi o to, aby cała kontrola zachowywała się jak lista rozwijana. Po naciśnięciu przycisku UIButton
pojawi się menu rozwijane UITableView
i umożliwi wybór.
To wszystko działa dobrze z hitTest
zmienione w UIButton
jak opisano w Apple Q & Link powyżej, jeżeli kontrola jest bezpośrednim dzieckiem najwyższej UIView
. Jeśli jednak kontrola znajduje się w innej hierarchii widoku, UITableView
nie otrzymuje zdarzeń dotyku.
Poniżej znajduje się kod hitTest używane:
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:
przepraszam, że nie będąc w stanie spojrzeć na odpowiedzi i sprawdź, czy oni rozwiązać ten problem, ze względu na niektóre inne zadania wymagające natychmiastowej uwagi. Sprawdzę je i przyjmuję pomoc, która pomaga. Dziękuję za cierpliwość.
Nie, problem z poprzednią implementacją polegał na tym, że punkt nie został poprawnie przekonwertowany na system współrzędnych "UITableView". Więc nawet w powyższym przypadku 'CGRectContainsPoint' nie identyfikuje punktu, który ma znajdować się w granicach' UITableView'. – Rajesh
Zaktualizowałem swoją odpowiedź, mam nadzieję, że pomożesz. –
Dzięki, ale potrzebuję ogólnego sposobu, aby to zrobić. Niezależnie od liczby poziomów hierarchicznych, kontrola jest w. – Rajesh