¿Por qué está pasando esto?
Esto se debe a que cuando su subvista se encuentra fuera de los límites de su supervista, los eventos táctiles que realmente suceden en esa subvista no se entregarán a esa subvista. Sin embargo, SERÁ ser entregado a su supervista.
Independientemente de si las subvistas se recortan visualmente o no, los eventos táctiles siempre respetan el rectángulo de límites de la supervista de la vista de destino. En otras palabras, los eventos táctiles que ocurren en una parte de una vista que se encuentra fuera del rectángulo de límites de su supervista no se envían a esa vista. Enlace
¿Qué necesitas hacer?
Cuando su supervista reciba el evento táctil mencionado anteriormente, deberá decirle a UIKit explícitamente que mi subvista debería ser la que reciba este evento táctil.
¿Y el código?
En su supervista, implemente func hitTest(_ point: CGPoint, with event: UIEvent?)
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if isHidden || alpha == 0 || clipsToBounds { return super.hitTest(point, with: event) }
// convert the point into subview's coordinate system
let subviewPoint = self.convert(point, to: subview)
// if the converted point lies in subview's bound, tell UIKit that subview should be the one that receives this event
if !subview.isHidden && subview.bounds.contains(subviewPoint) { return subview }
return super.hitTest(point, with: event)
}
Gotchya fascinante: debes ir a la "supervista más alta demasiado pequeña"
Tienes que ir "arriba" a la vista "más alta" a la que se encuentra la vista del problema.
Ejemplo típico:
Digamos que tiene una pantalla S, con una vista de contenedor C. La vista del controlador de vista de contenedor es V. (Recuerde que V se ubicará dentro de C y tendrá el tamaño idéntico). V tiene una subvista (tal vez un botón) B. B es el problema vista que en realidad está fuera de V.
Pero tenga en cuenta que B también está fuera de C.
En este ejemplo, usted tiene que aplicar la solución override hitTest
, de hecho, a C, no a V . Si lo aplica a V, no hace nada.