2011-09-01 7 views
7

Nella mia app, ho una vista overlay, che viene visualizzata quando si verificano alcuni processi e reti. È solo una vista semitrasparente (sottoclasse di UIView) con un indicatore di caricamento su di esso, che riempie l'intero schermo.bloccare l'interazione dell'utente con le viste sottostanti

Voglio impedire a qualsiasi vista sottostante di ricevere l'interazione dell'utente (ad esempio, una vista tabella sottostante non deve essere scorsa, un pulsante non può essere premuto).

Qual è il modo migliore in cui posso farlo all'interno della vista di sovrapposizione?

+0

La vista di sovrapposizione è nella parte superiore della pila di viste? – Nekto

risposta

10

Basta impostare la proprietà userInteractionEnabled per la vista sovrapposizione su YES. Ciò farà sì che tutti gli eventi tattili si verifichino nella vista overlay e non vengano passati alle viste sottostanti.

+0

Sei stato il primo =) – Nekto

+4

Non funziona per me, ho provato a impostarlo sia in init che in loadView, in entrambi i casi i pulsanti sottostanti continuano a ricevere eventi di tocco. – Ahti

+0

@Ahti: stai usando Interface Builder? (Non credo che tu lo sia, ma semplicemente assicurandoti.) –

4

È sufficiente impostare la proprietà userInteractionEnabled della vista sovrapposizione semitrasparente da a YES.

1

Accertarsi solo che la vista di sovrapposizione e tutte le sue viste genitore non abbiano userInteractionEnabled impostato su NO, non siano nascosti e non abbiano uno alpha inferiore a 0,01. Quindi i tocchi dell'utente interagiranno con l'overlay anziché con le viste visibili dietro di esso. Sappi anche che non bloccherà l'interazione in un'area che non è coperta dalle sue anteprime: anche se la tua vista copre l'intero schermo, se il suo genitore è solo 10x10 allora bloccherà solo l'interazione all'interno dell'area 10x10 coperta dal suo genitore.

Potrebbe anche essere necessario assicurarsi che resignFirstResponder venga richiamato su qualsiasi primo risponditore esistente o che l'utente sia ancora in grado di interagire con esso tramite la tastiera.

2

Penso che il modo migliore è quello di utilizzare questi 2 metodi:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

destra prima di fare le operazioni di trasformazione pesanti, e dopo aver completato essi rispettivamente.

+0

Questa è stata l'unica risposta che ha funzionato per me. Funzionerà indipendentemente da dove si trova la sovrapposizione nella gerarchia della vista. Il mio overlay era su una scrollview, e questo era l'unico modo in cui potevo evitare lo scrolling senza apportare modifiche al controller della scrollview (poiché l'overlay è usato da diversi controller) – Cogwheel

+0

@Cogwheel Sono contento che abbia risolto il tuo problema! – ppalancica

Problemi correlati