web-dev-qa-db-fra.com

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

J'ai une vue qui contient deux vues. L'une de ces vues contient deux boutons et des étiquettes de texte. L'autre, avec alpha défini sur 0,25, a une UIActivityIndicatorView pour informer l'utilisateur que l'application fonctionne et qu'il doit attendre jusqu'à ce qu'elle se termine. Si l'utilisateur touche un bouton alors que la UIActivityIndicatorView tourne, lorsque la UIActivityIndicatorView s'arrête, l'application mémorise l'action de l'utilisateur et y répond. Comment puis-je ignorer l'interaction utilisateur qui se produit pendant que la UIActivityIndicatorView tourne?

Merci d'avoir lu.

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

EDITED:

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];
}
21

J'ai trouvé ces méthodes très utiles:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
109
ppalancica

Dans Swift 3.0 Pour désactiver l’interaction: -

UIApplication.shared.beginIgnoringInteractionEvents()

Pour restaurer l'interaction: -

UIApplication.shared.endIgnoringInteractionEvents()
4
Shailendra Suriyal
[_button setUserInteractionEnabled:NO];

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

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];

}

}
4
DavidM

Pour désactiver un événement tactile dans une vue,

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

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

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
4
Raja Jimsen

il suffit d'ajouter 

[self.view setUserInteractionEnabled:NO];  

avant le 

[self.activityIndicator startAnimating];  

et l'activer après

[self.activityIndicator stopAnimating];
[self.view setUserInteractionEnabled:YES]; 
3
Omar Freewan
@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 utilisez du code, utilisez self.activityIndicator.animationDidStop pour déterminer quand exécuter votre travail

1
Mohsen Hossein pour

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

[SVProgressHUD showWithMaskType: SVProgressHUDMaskTypeBlack];


utiliser la déclaration ci-dessus pour désactiver les touches d'arrière-plan

[SVProgressHUD rejeter]

Pour activer les touches de fond. 

1
Dinesh Reddy Chennuru

Vous pouvez désactiver/activer les boutons UIB en fonction de la valeur UIActivityIndicatorView affichée ou non. Ou, si vous voulez simplement "ignorer l'interaction utilisateur" alors que le compteur est affiché, dans la méthode de gestion des boutons:

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

Cet exemple suppose que lorsque vous masquez la UIActivityIndicatorView, vous appelez l’un des suivants:

[spinner removeFromSuperview];

ou

[spinner stopAnimating];
1
octy

A solution rapide : ajoute une vue transparente ou pseudo transparente couvrant l’ensemble de l’écran. Ajoutez votre indicateur d'activité en haut 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 masquer la totalité de l'écran dans toutes les situations, consiste à gérer l'état de l'application (ignorer les actions lorsque l'application est «occupée») et à activer/désactiver les boutons et autres contrôles appropriés en fonction de chaque application. Etat.

0
djromero

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

0
vipin bansal