2011-09-01 13 views
7

Mam w widoku aplikacji widok nakładki wyświetlany podczas przetwarzania i nawiązywania kontaktów. Jest to po prostu półprzezroczysty widok (podklasa UIView) ze wskaźnikiem ładowania na nim, wypełniającym cały ekran.blokowanie interakcji użytkownika z widokami podstawowymi

Chcę uniemożliwić dowolnemu z podstawowych widoków uzyskanie interakcji użytkownika (np. Widok tabeli nie powinien być przewijany, nie należy naciskać przycisku).

Jaki jest najlepszy sposób, w jaki mogę to zrobić z widoku nakładki?

+0

Czy Twój widok nakładki znajduje się w górnej części stosu widoku? – Nekto

Odpowiedz

10

Wystarczy ustawić właściwość userInteractionEnabled dla widoku nakładki na YES. Spowoduje to, że wszystkie zdarzenia dotyku pojawią się w widoku nakładki i nie zostaną przekazane do podstawowych widoków.

+0

Jesteś pierwszy =) – Nekto

+4

Nie działa dla mnie, próbowałem ustawić go w init, jak również w loadView, w obu przypadkach przyciski poniżej nadal otrzymują zdarzenia dotykowe. – Ahti

+0

@Ahti: Czy w ogóle używasz Kreatora interfejsu? (Nie sądzę, że tak, ale tylko upewniając się.) –

4

Wystarczy ustawić właściwość userInteractionEnabled z półprzezroczystego widoku nakładki na wartość na wartość TAK.

1

Tylko upewnij się, że widok nakładki i wszystkie jej widoki nadrzędne nie mają wartości userInteractionEnabled ustawionej na NIE, nie są ukryte i nie mają wartości alpha mniejszej niż 0,01. Następnie dotknięcia użytkownika będą wchodzić w interakcję z nakładką zamiast widokami widocznymi za nią. Pamiętaj też, że nie będzie blokować interakcji w obszarze, który nie jest objęty jego superwiporami: nawet jeśli twój widok obejmuje cały ekran, jeśli jego rodzic ma tylko 10x10, blokuje on tylko interakcje w obrębie obszaru 10x10 objętego przez jego rodzica.

Być może trzeba będzie również zadbać o to, aby resignFirstResponder został wywołany na jakimkolwiek istniejącym pierwszym reagowaniu, lub użytkownik nadal będzie mógł wchodzić z nim w interakcję za pomocą klawiatury.

2

Myślę, że najlepszym sposobem jest użycie tych 2 metod:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

tuż przed wykonaniem ciężkie operacje przetwarzania, a po zakończeniu ich odpowiednio.

+0

To była jedyna odpowiedź, która zadziałała dla mnie. Będzie działać niezależnie od tego, gdzie znajduje się nakładka w hierarchii widoku. Moja nakładka była na przewijaniu i był to jedyny sposób, w jaki mogłem zapobiec przewijaniu bez zmiany kontrolera przewijania (ponieważ nakładka jest używana przez kilka kontrolerów). – Cogwheel

+0

@ Koło zębate Cieszę się, że rozwiązał twój problem! – ppalancica

Powiązane problemy