Были и подобные вопросы раньше, и я упомянул Capturing touches on a subview outside the frame of its superview using hitTest:withEvent: и Delivering touch events to a view outside the bounds of its parent view. Но они, похоже, не отвечают на мою конкретную проблему.Получение событий прикосновения за пределами границ
У меня есть пользовательский элемент управления со следующей структурой:
+-------------------------------+
| UIButton |
+-------------------------------+
| |
| |
| UITableView |
| |
| |
+------------------------- +
Обычай управления перекрывает UIButton
подкласс и добавляет UITableView
как его подвид. Идея состоит в том, чтобы весь контрольный акт выглядел как выпадающий список. Когда нажата кнопка UIButton
, выпадающий список UITableView
включит выбор.
Это все работает отлично с hitTest
переопределен в UIButton
, как описано в Q в компании Apple & Ссылку выше, если управление является непосредственным потомком самого верхнего UIView
. Однако, если элемент управления находится в другой иерархии представлений, UITableView
не получает события касания.
Ниже приведен код Трассировка используется:
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:
Я извиняюсь за не имея возможности посмотреть на ответы и проверить, если они решить эту проблему, из-за некоторых другие задачи, требующие немедленного внимания. Я проверю их и приму помощь. Спасибо за ваше терпение.
Нет, проблема с предыдущей реализацией заключалась в том, что точка не была правильно преобразована в систему координат UITableView. Поэтому даже в вышеприведенном случае «CGRectContainsPoint» не определяет точку, которая должна находиться в границах «UITableView». – Rajesh
Я обновляю свой ответ, надеюсь, вы поможете. –
Спасибо, но мне нужен общий способ сделать это. Независимо от количества иерархических уровней, в которых находится элемент управления. – Rajesh