Ситуация, которую я пытался сделать, это создать панель управления с использованием элементов управления внутри вложенного UIStackView. Некоторые из элементов управления были UITextField другие с UIButton's. Также были ярлыки для идентификации элементов управления. Я хотел поместить большую «невидимую» кнопку за панелью управления, чтобы, если пользователь нажал на область за пределами кнопки или текстового поля, я мог поймать это и предпринять необходимые действия - в первую очередь отклонить любую клавиатуру, если текст поле было активным (resignFirstResponder). Тем не менее, нажатие на ярлык или другую пустую область на панели управления не будет проходить через все. Вышеприведенные обсуждения были полезны для придания моего ответа ниже.
По сути, я подклассифицировал UIStackView и переписал подпрограмму «point (inside: with)», чтобы найти тип элементов управления, которым необходимо касание, и «игнорировать» такие вещи, как метки, которые я хотел игнорировать. Он также проверяет внутри UIStackView, чтобы вещи могли вернуться в структуру панели управления.
Код, возможно, немного более подробный, чем должен быть. Но это было полезно при отладке и, надеюсь, даст больше ясности в том, что делает рутина. Просто убедитесь, что в Интерфейсном Разработчике измените класс UIStackView на PassThruStack.
class PassThruStack: UIStackView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
for view in self.subviews {
if !view.isHidden {
let isStack = view is UIStackView
let isButton = view is UIButton
let isText = view is UITextField
if isStack || isButton || isText {
let pointInside = view.point(inside: self.convert(point, to: view), with: event)
if pointInside {
return true
}
}
}
}
return false
}
}