2012-03-04 8 views
20

Jak mogę wyłączyć wszystkie wejścia, gdy UIActivityIndicatorView obraca się?Wyłącz wszystkie dane wejściowe, gdy program UIActivityIndicatorView jest odwracany.

Dzięki

+1

Jeśli dodać tarczy do UIAlertView a następnie pokazać alert, to osiągnie to, o co prosisz. – Luke

+0

Możesz również uzyskać ładny efekt za pomocą [MBProgressHUD] (https://github.com/matej/MBProgressHUD), ale może być on większy, niż chcesz, w zależności od tego, co próbujesz osiągnąć. – FluffulousChimp

+0

dzięki Luke, jak mogę "zniszczyć" UIAlertView, jeśli chcę, aby zniknął. Czy można mieć 0 przycisków? – mica

Odpowiedz

50

można zadzwonić beginIgnoringInteractionEvents po uruchomieniu spinner

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

endIgnoringInteractionEvents i kiedy go zatrzymać.

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

Wystarczy upewnić się, że kod zawsze przychodzi do punktu, gdzie można nazwać endIgnoringInteractionEvents, w przeciwnym wypadku aplikacja będzie zamrażać (z punktu widzenia użytkownika).

+0

Dzięki, działa dobrze. Ale jak widzę, widok "zapamiętuje" dotyk i wywołuje zdarzenie po końcuIgnoreInteractionsEvent. Czy to zachowanie można zmienić? – mica

+1

@mica: wow, to interesująca obserwacja - nie zauważyłem tego wcześniej. Spojrzę na to. Jeśli się spieszysz, możesz "sendEvent" z głównego okna aplikacji hijaack i tam zdecydować (np. Sprawdzając flagę, czy tarcza animuje się, czy nie), jeśli wyślesz zdarzenie w dół łańcucha respondenta lub zignorujesz to . Jednym ze sposobów na hijaack tego okna jest [tutaj] (http://stackoverflow.com/questions/92511741/detect-if-the-user-has-touched-the-screen/9293321#9293321) (odpowiedź z 'MyKindOfWindow 'definicja). –

+0

@mica: wygląda na to, że znalazłeś błąd. Według [documentation] (https://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html) nie powinno to mieć miejsca: "Wyłączenie dostarczania zdarzeń dotykowych dla Aplikacja może wywołać metodę UIApplication beginIgnoringInteractionEvents, a następnie wywołać metodę endIgnoringInteractionEvents Pierwsza metoda zatrzymuje aplikację od odbierania zdarzeń dotykowych w całości, druga metoda jest wywoływana w celu wznowienia odbioru takich zdarzeń –

1

Tylko dodatek do odpowiedzi na rokjarc. Oto przykład watchdoga, aby utrzymać aplikację przy życiu. Możesz zadzwonić zawsze z pewnym krytycznym interwałem, może 10 sekund. Jeśli musisz włączyć w ciągu 10 sekund, po prostu wywołaj metodę "włącz".

UIWindow * __weak mainWindow; 

- (void)disableGlobalUserInteractionForTimeInterval:(NSTimeInterval)interval 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     mainWindow = [[[UIApplication sharedApplication] windows] lastObject]; 
    }); 

    [mainWindow setUserInteractionEnabled:false]; 

    if (interval > 0) 
    { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      [self enableGlobalUserInteraction]; 
     }); 
    } 
} 

- (void)enableGlobalUserInteraction 
{ 
    if (mainWindow) 
    { 
     [mainWindow setUserInteractionEnabled:true]; 
    } 
} 
2

w Swift 3.0:

Aby wyłączyć interakcje:

UIApplication.shared.beginIgnoringInteractionEvents() 

Aby przywrócić interakcji:

UIApplication.shared.endIgnoringInteractionEvents() 
Powiązane problemy