2010-05-29 2 views
0

Je travaille sur des applications iPhone depuis plusieurs semaines. Maintenant, je rencontre un problème d'animation que je n'arrive pas à résoudre. Mayhbe vous pouvez aider. Voici les détails (un peu long, ours avec moi):Possible bug de synchronisation/rendu de l'animation iphone?

Fondamentalement l'effet que je veux réaliser est, quand l'utilisateur clique sur un bouton, une vue de chargement apparaît, cachant l'écran entier; et puis les applications font beaucoup de calculs lourds, ce qui prend quelques secondes. Une fois le calcul effectué, les vues de résultat Soem (quelque chose comme les vérificateurs sur un damier) sont affichées sous la vue de chargement. Une fois que toutes les vues de résultat sont rendues, j'ai utilisé l'animation d'animation pour supprimer la vue de chargement et montrer les vues de résultat à l'utilisateur. Voici ce que je fais:

  1. lorsque l'utilisateur clique sur un bouton, exécutez ce code:

    [UIView beginAnimations: contexte néant néant]; [UIView setAnimationDuration: 1.0]; [UIView setAnimationBeginsFromCurrentState: YES]; [UIView setAnimationTransition: UIViewAnimationTransitionCurlDown forView: mémoire cache self.view: YES]; [UIView setAnimationDelegate: self]; [UIView setAnimationDidStopSelector: @selector (loadingViewInserted: terminé: contexte :)]; // utilise un nombre d'index très élevé donc il sera toujours au-dessus [self.view insertSubview: loadingViewController.view atIndex: 1000];

    [UIView commitAnimations]; 
    
  2. Dans la fonction « loadingViewInserted », il appelle une autre fonction de faire le travail de calcul lourd. Une fois le calcul effectué, un grand nombre de vues de résultats (comme les vérificateurs sur un damier) sont affichées sous la vue de chargement.

    for(int colIndex = 1; colIndex <= result.columns; colIndex++) { 
        for(int rowIndex = 1; rowIndex <= result.rows; rowIndex++) { 
         ResultView *rv = [ResultView resultViewWithData:results[colIndex][rowIndex]]; 
          [self.view addSubview:rv]; 
        } 
    } 
    
  3. Une fois que toutes les vues de résultats sont ajoutés, animation suivante est appelée pour effacer la vue de chargement:

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
    [loadingViewController.view removeFromSuperview]; 
    
    [UIView commitAnimations]; 
    

En faisant cela, la plupart du temps (peut-être 90%), il ne exactement ce que je veux. Cependant, parfois je vois un résultat bizarre: la vue de chargement apparaît d'abord comme prévu, puis avant qu'elle ne disparaisse, certaines vues de résultat, qui supposent être sous la vue de chargement, apparaissent soudainement au-dessus de la vue de chargement; et certains d'entre eux sont partiellement rendus. Et puis la vue de chargement s'est recroquevillée, et tout a l'air normal à nouveau. La situation étrange ne dure que moins d'une seconde, mais déjà assez mauvaise pour bousiller l'interface utilisateur.

J'ai essayé toutes sortes de choses différentes pour résoudre ce problème (en utilisant un autre thread pour supprimer la vue de chargement, rendre la vue de chargement non transparente), mais aucune ne fonctionne. La seule chose qui fait un peu mieux, c'est que je cache d'abord toutes les vues des résultats; une fois la dernière animation terminée, dans son rappel, afficher toutes les vues de résultat. Mais cela perd le bel effet que lorsque vous vous retrouvez dans la vue de chargement, les résultats sont déjà là. À ce stade, je pense vraiment que c'est un bug dans iphone (je compile avec OS 3.0) OS. Ou peut-être que vous pouvez souligner ce que j'ai fait de mal (ou pourrait faire différemment).

(merci pour terminer ce long post, :-))

Répondre

1

addSubview est censé ajouter le sous-vue au-dessus de son point de vue par les pairs.Vous voulez probablement insertSubview: belowSubview:

Je suppose que cela "fonctionne" parfois parce que le calcul stagne l'animation, en raison de la contention du processeur.

+0

oui, c'est exactement le problème. J'y ai pensé, mais j'ai été troublé par le fait que cela fonctionne un peu de temps. J'ai ajouté un appel "bringSubViewTOFront" et maintenant tout va bien. Merci. –

Questions connexes