2011-04-14 3 views
8

Je veux fade-out vue car il défile dans un UIScrollView parent. Lorsque l'animation de fondu disparaît, la vue déroulante cesse de défiler. Il saute à la position correcte lorsque le fondu est terminé.animation dans un UIScrollView

Mon fade-out est atteint avec des objets animateWithDuration et bloc, sur une page déclenché changement que je perçois dans scrollViewWillBeginDragging.

Est-ce que quelqu'un sait comment les faire deux se produisent en même temps? Juste pour être clair, je n'anime pas le défilement de UIScrollView - plutôt cela se passe via l'interaction de l'utilisateur de glisser.

EDIT:

Voici le code que je utilise pour effacer le UIView. Ce code est dans une classe dérivée UIViewController, qui est le délégué pour un UIScrollView. Lorsque l'utilisateur commence à faire glisser son doigt, je souhaite masquer la sous-vue. Mais lorsque l'utilisateur commence à draggin un doigt, la sous-vue s'estompe et le défilement s'arrête. Une fois que le sous-affichage a complètement disparu, l'affichage du défilement s'aligne sur l'emplacement où se trouve le doigt de l'utilisateur.

-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView 
{ 
    [UIView animateWithDuration:0.5 
     animations:^ 
     { 
      self.subView.alpha = 0.0f; 
     } 
     completion:^(BOOL finished) { }]; 
} 

Répondre

10

très intéressant ... J'ai vérifié ceci, et oui, j'ai le même effet ... Eh bien, il semble que le animateWithDuration en quelque sorte bloque le fil conducteur ... qui n'est pas logique, et la documentation ne dit rien non plus .. Cependant, il y a une solution facile, quelque chose de similaire à ceci: (i ai mis la durée de l'animation à 3 donc je peux voir qu'il fonctionne pendant que je me déplace mon rouleau Voir :) ...)

[UIView beginAnimations:@"FadeAnimations" context:nil]; 
[UIView setAnimationDuration:3]; 

self.subview.alpha = 0.0f; 

[UIView commitAnimations]; 
+0

Vous dites donc les méthodes de UIView normales ne touchent pas la table, alors que les méthodes de bloc font ? Assez étrange. –

+0

bien .. je ne sais pas pourquoi (encore), mais j'ai testé cela, et je peux confirmer que cela fonctionne comme ça ... – Moszi

+0

Très intéressant. :) –

12

Un peu en retard, mais si vous voulez continuer à utiliser des blocs, vous pouvez utiliser:

animateWithDuration: retard: Options: animation: complet:

ajouter "UIViewAnimationOptionAllowUserInteraction" aux options pour permettre une interaction pendant le défilement.

Je suis sûr que vous aurez toujours le problème de lag. Voici la meilleure façon de l'expliquer. S'il vous plaît pardonnez-moi d'avance, car je n'utilise probablement pas les bons termes. Toutes les animations doivent s'exécuter sur le thread principal. Lorsque vous appelez une animation, iOS en premier * P * rocesses puis * R * enders avant qu'il ne génère * F * rames. Ça ressemble à ça.

PPPPRRRRFFFFFFFFFFFFFFFFFF

Mais depuis ScrollViews ne savent pas combien de temps votre animation va être ou quand elle prendra fin, il doit effectuer l'animation comme celui-ci.

PRFPRFPRFPRFPRFPRFPRFPRF

Ma théorie est que le retard que vous rencontrez doit faire avec ces deux appels entrant en collision sur le thread principal en même temps. Je ne suis pas sûr de savoir comment résoudre ce problème autrement qu'avec une puce plus rapide. J'ai ce que vous pourriez pousser une animation pour le processeur et un pour le GPU, mais je ne suis pas encore avancé en programmation.

+0

Cette solution n'a pas fonctionné pour moi:/ – Lirik

0

Selon les informations qui est encore pas censé être largement libéré, toutes les versions 4.x iOS bloquer complètement l'interaction de l'utilisateur alors que l'animation est en cours.

N'est-il pas intéressant, cependant, que vous soyez évidemment encore inscrit lors de l'animation? Hmm ... peut-être que ça veut dire que quelque chose de nouveau arrive dans une version à paraître!

Si vous le pouvez, lisez la documentation iOS 5 Beta sur les méthodes de classe UIView.

8

Je suggérerais, puisque l'opacité est basée sur les mouvements du doigt de l'utilisateur dans le UIScrollView, en utilisant la méthode déléguée scrollViewDidScroll :. Le scrollView passé en paramètre peut être utilisé pour vérifier le contentOffset qui est simplement un CGPoint indiquant jusqu'où dans la vue de contenu de l'UIScrollView l'utilisateur a défilé. Quelque chose comme cela peut être utilisé pour relier la position de défilement à l'opacité d'une vue donnée dans un UIScrollView paginé:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    // The case where I used this, the x-coordinate was relevant. You may be concerned with the y-coordinate--I'm not sure 
    CGFloat percent = ((int)(scrollView.contentOffset.x) % (int)(scrollView.frame.size.width))/scrollView.frame.size.width; 
    if (percent > 0.0 && percent < 1.0) { // Of course, you can specify your own range of alpha values 
    relevantView.alpha = percent; // You could also create a mathematical function that maps contentOffset to opacity in a different way than this 
    } 
} 
+0

Jacob, tu es le roi! – Luda

+0

solution parfaite de logicak, j'ai converti pour le score verticall merci mate – Alok

Questions connexes