Как писал ДонМаг:
Вы не можете взаимодействовать с элементом, который выходит за пределы его родителя (суперпредставление).
По крайней мере, не безпереопределяя некоторые методы, представления имеют свои собственные реализации для обнаружения касаний.Наиболее важные методы:
func hitTest(_ point: CGPoint,
with event: UIEvent?) -> UIView?
func point(inside point: CGPoint,
with event: UIEvent?) -> Bool
Эти методы должны быть переопределены, я вставил некоторый код в мой, довольно старый, поэтому, вероятно, потребуется быстрая миграция с 3.x до 4.x.Все, что вы добавите в качестве подпредставления, будет обрабатывать прикосновения, даже если оно выходит за пределы:
class GreedyTouchView: UIView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if !self.clipsToBounds && !self.isHidden && self.alpha > 0.0 {
let subviews = self.subviews.reversed()
for member in subviews {
let subPoint = member.convert(point, from: self)
if let result: UIView = member.hitTest(subPoint, with:event) {
return result
}
}
}
return super.hitTest(point, with: event)
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return super.point(inside: point, with: event)
}
}
Но я хотел бы отметить, что выпадающие меню больше связаны с веб-интерфейсом, а не с iOSСвязанный с пользовательским интерфейсом, вы должны использовать вместо этого выбора.