Mi problema: tengo una supervista EditView
que ocupa básicamente todo el marco de la aplicación, y una subvista MenuView
que ocupa solo el ~ 20% inferior, y luego MenuView
contiene su propia subvista ButtonView
que en realidad reside fuera de MenuView
los límites (algo como esto :) ButtonView.frame.origin.y = -100
.
(nota: EditView
tiene otras subvistas que no forman parte de MenuView
la jerarquía de vistas, pero que pueden afectar la respuesta).
Probablemente ya conozca el problema: cuando ButtonView
está dentro de los límites de MenuView
(o, más específicamente, cuando mis toques están dentro MenuView
de los límites de), ButtonView
responde a eventos de toque. Cuando mis toques están fuera de MenuView
los límites (pero aún dentro ButtonView
de los límites), no se recibe ningún evento de toque ButtonView
.
Ejemplo:
- (E) es
EditView
el padre de todas las vistas - (M) es
MenuView
una subvista de EditView - (B) es
ButtonView
una subvista de MenuView
Diagrama:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
Debido a que (B) está fuera del marco de (M), nunca se enviará un toque en la región (B) a (M); de hecho, (M) nunca analiza el toque en este caso, y el toque se envía a el siguiente objeto de la jerarquía.
Objetivo: Supongo que la anulación hitTest:withEvent:
puede resolver este problema, pero no entiendo exactamente cómo. En mi caso, ¿debería hitTest:withEvent:
anularse en EditView
(mi supervista 'maestra')? ¿O debería MenuView
anularse en la supervisión directa del botón que no recibe toques? ¿O estoy pensando en esto incorrectamente?
Si esto requiere una explicación extensa, un buen recurso en línea sería útil, excepto los documentos UIView de Apple, que no me lo han dejado claro.
¡Gracias!
fuente
Ok, investigué un poco y probé, así es como
hitTest:withEvent
funciona, al menos a un alto nivel. Imagen de este escenario:Diagrama:
Debido a que (B) está fuera del marco de (M), nunca se enviará un toque en la región (B) a (M); de hecho, (M) nunca analiza el toque en este caso, y el toque se envía a el siguiente objeto de la jerarquía.
Sin embargo, si implementa
hitTest:withEvent:
en (M), los toques en cualquier parte de la aplicación se enviarán a (M) (o al menos los conoce). Puede escribir código para manejar el toque en ese caso y devolver el objeto que debería recibir el toque.Más específicamente: el objetivo de
hitTest:withEvent:
es devolver el objeto que debería recibir el impacto. Entonces, en (M) puede escribir código como este:Todavía soy muy nuevo en este método y este problema, por lo que si hay formas más eficientes o correctas de escribir el código, comente.
Espero que eso ayude a cualquiera que responda a esta pregunta más adelante. :)
fuente
En Swift 5
fuente
Lo que haría es que tanto ButtonView como MenuView existan en el mismo nivel en la jerarquía de vistas colocándolos en un contenedor cuyo marco se ajuste completamente a ambos. De esta forma, la región interactiva del elemento recortado no se ignorará debido a los límites de su supervista.
fuente
Si tiene muchas otras subvistas dentro de su vista principal, probablemente la mayoría de las otras vistas interactivas no funcionarían si usa las soluciones anteriores, en ese caso, puede usar algo como esto (en Swift 3.2):
fuente
Si alguien lo necesita, aquí está la alternativa rápida.
fuente
Coloque las siguientes líneas de código en su jerarquía de vistas:
Para una mayor aclaración, se explicó en mi blog: "goaheadwithiphonetech" con respecto a "Llamada personalizada: problema en el que no se puede hacer clic en el botón".
Espero que eso te ayude...!!!
fuente