13 votes

Comment créer un indicateur d'activité au milieu de la vue de manière programmatique ?

Je travaille avec une application qui analyse un flux en ligne. Lorsque je clique sur le bouton d'actualisation, il faut un certain temps pour analyser à nouveau le fichier et afficher ses données. Je veux un indicateur d'activité au milieu de la vue lorsque je clique sur le bouton de rafraîchissement. Et lorsque l'analyse est terminée, cet indicateur doit disparaître.

J'utilise ce code mais il ne fonctionne pas :

- (IBAction)refreshFeed:(id)sender
{
   UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
   [self.view addSubview:spinner];

   [spinner startAnimating];

   // parsing code code

   [spinner release];
}

17voto

Walter Points 4484

Un UIActivityIndicator doit généralement être placé dans un thread distinct du processus long (analyse syntaxique du flux) afin d'apparaître.

Si vous voulez que tout reste dans le même fil, vous devez donner à l'indicateur le temps d'apparaître. Cette question Stackoverflow adresses plaçant un délai dans le code.

EDIT : Deux ans plus tard, je pense que chaque fois que vous utilisez un délai pour faire quelque chose, vous le faites probablement mal. Voici comment je ferais cette tâche maintenant :

- (IBAction)refreshFeed:(id)sender {
    //main thread
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [self.view addSubview:spinner];

    //switch to background thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        //back to the main thread for the UI call
        dispatch_async(dispatch_get_main_queue(), ^{
            [spinner startAnimating];
        });
        // more on the background thread

        // parsing code code

        //back to the main thread for the UI call
        dispatch_async(dispatch_get_main_queue(), ^{
            [spinner stopAnimating];
        });
    });
}

13voto

Sorin Antohi Points 3782

Je pense que je ne suis pas capable de l'expliquer ok, essayons à nouveau. C'est une application basée sur la nav J'ai une tableView. Chaque cellule crée une vue détaillée. qui est une tableView, il y a un bouton bouton de rafraîchissement. lorsque je clique sur ce bouton, le flux est analysé à nouveau. cela prend un certain temps. pendant ce temps Pendant ce temps, le programme ne répond pas. l'analyse est terminée, il fonctionne à nouveau. maintenant j'ai besoin d'un indicateur d'activité pour ce temps. Je ne sais pas comment l'ajouter dans le xib. j'ouvre main.xib et je mets l'indicateur d'activité indicateur d'activité dans le RootViewController. vient devant toute la tableView. Je me suis peut-être bien expliqué. Si ce n'est pas le cas, faites-le moi savoir et je réessayerai.

D'après ce que vous dites ci-dessus, le programme ne répond pas pendant l'analyse syntaxique, ce qui est un problème. Si l'interface graphique se fige pendant l'analyse des données, vous devez déplacer cette opération vers un thread secondaire. De cette façon, votre interface graphique reste réactive et vous pourrez voir l'indicateur d'activité.

sur le fil principal, vous devriez avoir quelque chose de similaire à ceci afin d'afficher l'indicateur d'activité :

UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
av.frame = CGRectMake(round((yourView.frame.size.width - 25) / 2), round((yourView.frame.size.height - 25) / 2), 25, 25);
av.tag  = 1;
[yourView addSubview:av];
[av startAnimating];

une fois que le fil secondaire est terminé, c'est le fil où vous analysez les données, vous devez appeler sur le fil principal quelque chose comme ceci pour supprimer l'indicateur d'activité :

UIActivityIndicatorView *tmpimg = (UIActivityIndicatorView *)[yourView viewWithTag:1];
[tmpimg removeFromSuperview];

7voto

7KV7 Points 19750

Changez le centre de l'indicateur d'activité en

activityIndicator.center = self.view.center;

7voto

Hardik Thakkar Points 11
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.alpha = 1.0;
[collectionVwSearch addSubview:activityIndicator];
activityIndicator.center = CGPointMake([[UIScreen mainScreen]bounds].size.width/2, [[UIScreen mainScreen]bounds].size.height/2);
[activityIndicator startAnimating];//to start animating

Pour Swift

let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
activityIndicator.alpha = 1.0
collectionVwSearch.addSubview(activityIndicator)
activityIndicator.center = CGPointMake(UIScreen.mainScreen().bounds.size.width / 2, UIScreen.mainScreen().bounds.size.height / 2)
activityIndicator.startAnimating()

Pour arrêter l'activitéIndicateur wirte [activityIndicator stopAnimating] à l'endroit approprié

2voto

Vaibhav Saran Points 4078
self.activity.center = CGPointMake(self.view.bounds.size.width / 2.0f, self.view.bounds.size.height / 2.0f);
self.activity.autoresizingMask = (UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X