Ситуацію, яку я намагався зробити, було побудувати панель управління, використовуючи елементи управління всередині вкладених UIStackView. Деякі елементи управління мали UITextField, інші - UIButton. Також були етикетки для ідентифікації елементів управління. Що я хотів зробити, це поставити велику "невидиму" кнопку за панеллю управління, щоб, якщо користувач натиснув область поза кнопкою чи текстовим полем, я міг би потім знайти це і вжити заходів - насамперед відхилити будь-яку клавіатуру, якщо текст поле було активним (resignFirstResponder). Однак натискання на ярлик чи іншу порожню область на панелі керування не пропустить речі. Наведені вище дискусії були корисними, коли я міг відповісти нижче.
В основному я підкласифікував UIStackView і перезаписав процедуру "point (inside: with)", щоб шукати тип елементів управління, які потребували дотику та "ігнорувати" речі, такі як мітки, які я хотів ігнорувати. Він також перевіряє наявність у UIStackView, щоб все могло повторитись у структурі панелі управління.
Код - це, мабуть, трохи більш багатослівний, ніж повинен бути. Але це було корисно в налагодженні і, сподіваємось, надає більш чіткості в тому, що робить рутина. Просто переконайтеся в програмі Interface Builder, щоб змінити клас 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
}
}