2012-03-04 29 views
20

¿Cómo puedo desactivar todas las entradas mientras el UIActivityIndicatorView está girando?Desactivar todas las entradas mientras UIActivityIndicatorView spinning

Gracias

+1

Si se agrega el control de giro a un UIAlertView y luego mostrar la alerta, entonces esto logrará lo que buscas. – Luke

+0

También puede lograr un buen efecto con [MBProgressHUD] (https://github.com/matej/MBProgressHUD) pero puede ser más pesado el que desee dependiendo de lo que esté tratando de lograr. – FluffulousChimp

+0

gracias Luke, ¿cómo "destruyo" el UIAlertView si quiero que desaparezca? ¿Está bien tener 0 botones? – mica

Respuesta

50

Puede llamar beginIgnoringInteractionEvents cuando se inicia el spinner

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

y endIgnoringInteractionEvents al detenerlo.

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

Sólo asegúrese de que su código siempre llega al punto en que se llama a endIgnoringInteractionEvents, de lo contrario su aplicación va a congelar (desde el punto de vista del usuario).

+0

Gracias, funciona bien. Pero como puedo ver, la vista "recuerda" un toque y dispara el evento después del endIgnoreInteractionsEvent. ¿Se puede cambiar este comportamiento? – mica

+1

@mica: wow, es una observación interesante, no lo había notado antes. Le daré un vistazo. Si tienes prisa puedes secuestrar el evento 'sendEvent:' de la ventana principal de la aplicación y allí decidir (es decir, verificando algún tipo de indicador si anima spinner o no) si envías un evento a la cadena de respuesta o lo ignoras . Una forma de secuestrar esta ventana es [aquí] (http://stackoverflow.com/questions/9251174/detect-if-the-user-has-touched-the-screen/9293321#9293321) (la respuesta con 'MyKindOfWindow 'definición). –

+0

@mica: parece que has encontrado un error. De acuerdo con [documentación] (https://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html) esto no debería suceder: "Desactivar la entrega de eventos táctiles para un Una aplicación puede llamar al método UIApplication beginIgnoringInteractionEvents y luego llamar al método endIgnoringInteractionEvents. El primer método detiene la aplicación para que no reciba eventos táctiles por completo, se llama al segundo método para reanudar la recepción de dichos eventos. –

1

Simplemente una adición a la respuesta de rokjarc. Aquí un ejemplo de perro guardián para mantener viva la aplicación. Puede llamar siempre con un intervalo crítico, tal vez 10 segundos. Y si necesita habilitarlo en 10 segundos, simplemente llame al método "enable".

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

En Swift 3.0:

Para desactivar la interacción:

UIApplication.shared.beginIgnoringInteractionEvents() 

Para restaurar la interacción:

UIApplication.shared.endIgnoringInteractionEvents() 
Cuestiones relacionadas