La situación que intentaba hacer era construir un panel de control usando controles dentro de UIStackView anidados. Algunos de los controles tenían otros de UITextField con UIButton. Además, había etiquetas para identificar los controles. Lo que quería hacer era poner un gran botón "invisible" detrás del panel de control para que si un usuario tocaba un área fuera de un botón o campo de texto, pudiera atraparlo y tomar medidas, principalmente descartar cualquier teclado si aparece un texto el campo estaba activo (resignFirstResponder). Sin embargo, al tocar una etiqueta u otra área en blanco en el panel de control no pasaría nada. Las discusiones anteriores fueron útiles para llegar a mi respuesta a continuación.
Básicamente, subclasifiqué UIStackView y sobrescribí la rutina "point (inside: with) para buscar el tipo de controles que necesitaban tocar e" ignorar "cosas como etiquetas que quería ignorar. También verifica el interior de UIStackView para que las cosas puedan repetirse en la estructura del panel de control.
El código es quizás un poco más detallado de lo que debería ser. Pero fue útil para la depuración y, con suerte, proporciona más claridad sobre lo que está haciendo la rutina. Solo asegúrese de que en Interface Builder cambie la clase de UIStackView's a 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
}
}