2011-09-01 19 views
7

En mi aplicación, tengo una vista de superposición, que se muestra cuando se está procesando y estableciendo una red. Es solo una vista semitransparente (subclase de UIView) con un indicador de carga en ella, llenando toda la pantalla.bloqueo de la interacción del usuario con vistas subyacentes

Quiero evitar que cualquiera de las vistas subyacentes reciba la interacción del usuario (por ejemplo, una vista de tabla subyacente no se debe desplazar, no se debe presionar un botón).

¿Cuál es la mejor manera de hacerlo desde dentro de la vista de superposición?

+0

¿Su vista de superposición se encuentra en la parte superior de la vista? – Nekto

Respuesta

10

Simplemente configure la propiedad userInteractionEnabled para la vista de superposición en YES. Esto hará que todos los eventos táctiles ocurran en la vista de superposición y no se pasen a las vistas subyacentes.

+0

Fuiste el primero =) – Nekto

+4

No funciona para mí, he intentado configurarlo tanto en init como en loadView, en ambos casos, los botones a continuación aún reciben eventos táctiles. – Ahti

+0

@Ahti: ¿Estás utilizando Interface Builder en absoluto? (No creo que lo estés, pero solo asegúrate.) –

4

Simplemente configure la propiedad userInteractionEnabled de su superposición semitransparente vista en YES.

1

Solo asegúrese de que la vista de superposición y todas sus vistas principales no tengan userInteractionEnabled establecido en NO, no estén ocultos, y no tengan un alpha menor que 0.01. Luego, los toques del usuario interactuarán con la superposición en lugar de las vistas visibles detrás de ella. También tenga en cuenta que no bloqueará la interacción en un área que no está cubierta por sus supervistas: incluso si su vista cubre toda la pantalla, si su padre es solo 10x10, entonces solo bloqueará la interacción dentro de esa área de 10x10 cubierta por su padre.

Es posible que también deba asegurarse de que se llama a resignFirstResponder en cualquier primera respuesta existente, o el usuario aún podrá interactuar con ella a través del teclado.

2

Creo que la mejor manera es utilizar estos 2 métodos:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

justo antes de hacer las operaciones de procesamiento pesados, y después de completarlas, respectivamente.

+0

Esta fue la única respuesta que funcionó para mí. Funcionará independientemente de dónde se encuentre su superposición en la jerarquía de vistas. Mi superposición estaba en una vista de desplazamiento, y esta era la única forma en que podía evitar el desplazamiento sin hacer un cambio en el controlador scrollview (ya que la superposición es utilizada por varios controladores) – Cogwheel

+0

@Cogwheel ¡Me alegra que haya resuelto su problema! – ppalancica

Cuestiones relacionadas