Ne pas autoriser l'interaction de l'user lorsque la vue de l'indicateur d'activité est visible

J'ai une vue qui contient deux vues. Une de ces vues contient deux buttons et des labels de text. L'autre, avec un alpha à 0.25, a un UIActivityIndicatorView pour indiquer à l'user que l'application fonctionne et il doit attendre jusqu'à ce qu'il se termine. Si l'user appuie sur un button pendant que le UIActivityIndicatorView tourne, lorsque l' UIActivityIndicatorView s'arrête, l'application se souvient de l'action de l'user et y répond. Comment puis-je rejeter l'interaction de l'user qui se produit pendant que le UIActivityIndicatorView tourne?

Merci d'avoir lu.

PD: Comme c'est commenté dans ce fil , je préfère ne pas utiliser de solution modale.

ÉDITÉ:

J'utilise actuellement ce code et cela ne fonctionne pas correctement.

 - (void)viewDidAppear:(BOOL)animated { // The view appears with an UIActivityIndicatorView spinning. [self showResults]; // The method that takes a long time to finish. [self.activityIndicator stopAnimating]; // When the showResults method ends, the view shows the buttons to the user. [self.activityIndicatorView setHidden:YES]; [self.menuButton setEnabled:YES]; [self.menuButton setUserInteractionEnabled:YES]; [self.playButton setEnabled:YES]; [self.playButton setUserInteractionEnabled:YES]; [self.view setUserInteractionEnabled:YES]; [self.interactionView setUserInteractionEnabled:YES]; } 

J'ai trouvé ces methods très utiles:

 [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
 [_button setUserInteractionEnabled:NO]; 

Cela devrait le désactiver, il suffit de définir OUI pour quand vous voulez que l'user appuie dessus.

 BOOL i_am_ready_to_submit = NO; -(void)action_finished{ [self.activityIndicator stopAnimating]; i_am_ready_to_submit = YES; } -(IBAction)submit_button{ if(i_am_ready_to_submit){ [self submit]; } } 

Ajoutez simplement

 [self.view setUserInteractionEnabled:NO]; 

avant le

 [self.activityIndicator startAnimating]; 

et réactiver après

 [self.activityIndicator stopAnimating]; [self.view setUserInteractionEnabled:YES]; 

Pour désactiver l'événement tactile dans une vue,

 [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

Pour activer l'événement tactile dans une vue

 [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

Dans l'interaction Swift 3.0 To Disable: –

 UIApplication.shared.beginIgnoringInteractionEvents() 

Pour restaurer l'interaction: –

 UIApplication.shared.endIgnoringInteractionEvents() 

Utilisez SVProgressHUD WrapperClass Il y a tellement d'options pour montrer ActivityIndicator
Pour le code source Cliquez ici!

[SVProgressHUD showWithMaskType: SVProgressHUDMaskTypeBlack];

utilisez l'instruction ci-dessus pour désactiver les touches d'arrière-plan

[SVProgressHUD rejeter]

Pour activer les touches d'arrière-plan.

 @IBAction func yourButtonPressed(sender: UIButton) { if self.activityIndicator.isAnimating() { //remember the action user asked of you using the sender } else { //do your stuff return } yourButtonPressed(yourButton) } 

ou vous code utilisez self.activityIndicator.animationDidStop pour déterminer quand lancer vos affaires

Une solution rapide : ajoutez une vue transparente ou pseudo-transparente qui couvre tout l'écran. Ajoutez votre indicateur d'activité au-dessus de cette vue. Lorsque la période d'attente se termine, supprimez les deux vues. Obtenez de l'inspiration .

Une meilleure solution, car vous ne pouvez pas cacher l'écran dans toutes les situations, est de gérer l'état de l'application (ignorer les actions lorsque l'application est 'occupée') et désactiver / activer les buttons appropriés et autres controls en fonction de chaque application Etat.

Vous pouvez désactiver / activer les UIButtons en fonction de l' UIActivityIndicatorView ou non. Ou, si vous voulez juste "éliminer l'interaction de l'user" pendant que le spinner est affiché, dans la méthode du gestionnaire de buttons:

 - (void)buttonTapped:(id)sender { if ([spinner superview] != nil && [spinner isAnimating]) { return; } // ... the rest of your code } 

Cet exemple suppose que lorsque vous masquez UIActivityIndicatorView vous appelez l'un des éléments suivants:

 [spinner removeFromSuperview]; 

ou

 [spinner stopAnimating]; 

Bien que la réponse soit répondue dans la réponse précédente, juste comme append à titre d'information "[self.activityIndicatorView setHidden: YES];" pas besoin d'appeler cette méthode explicitement, car startAnimating / stopAnimating s'en charge déjà. Je suppose que vous utilisez la valeur par défaut de "hidesWhenStopped" propriété.