6
votes

Contenu Animation offset brisée

J'ai une animation qui est lancée quand un geste reconnaissant (Double Tap) incendie: xxx

Ça fonctionne bien, sauf dans un cas: si Scrollviewwillbegindecelerating Délégué La méthode n'est pas appelée avant l'exécution d'animation (juste en traînant à peine mon ScrollView).

J'ai juste ScrollViewDidenDendRagging METHODE appelée.Je peut attendre 20 secondes, puis jouer à mon animation. Ça va jouer correctement sauf pour mon contentoffset .

Les méthodes déléguées elles-mêmes ne font rien, ils n'ont été ajoutés que pour voir où le problème pourrait être.

Je n'ai aucune idée de pourquoi.

Edit: Voici un vidéo de mon problème. Phase 1: Faites défiler avec décélération et phase 2 sans. Regardez une position finale. La phase 1 est correcte mais pas phase


13 commentaires

Dites-vous que parfois ScrollViewWillbegindecelerating n'est pas appelé?


Non c'est normal. J'arrête directement mon défilement afin que cela n'aura pas d'effet de décélération. Alors, quand je fais que mon animation est cassée. Mais mon geste a décélérateur implicitement ça marche. Je ne sais pas si je claire ...


S'il vous plaît pouvez-vous mettre à jour votre question pour montrer où et quand vous appelez cette animation?


Je voulais dire quelles méthodes vous l'appelez, mais la vidéo aidez!


Je fais défiler et après (il peut être 2 secondes ou 10 min) Je lance mon bloc d'animation à partir d'un geste (Uitapaveture double Tap).


Très bien cool. La vidéo aide. Cependant, pouvons-nous voir quelques extraits de code. Particulièrement vos méthodes Uiscrolldelegate?


Oui parce qu'il n'y a rien à l'intérieur d'eux. Je viens de mettre mon délégué pour voir où mon problème était


J'ai mis à jour votre question basée sur vos commentaires. Le fait que vous appeliez l'animation d'un reconnaisseur de geste était important. Si j'ai quelque chose de mal, veuillez ré-modifier.


OK merci. Alors tu penses que ça vient du geste?


Dans ma compréhension de votre vidéo, la vue a une bg rouge est le _scrollviewcontentview.et the ScrollView est la vue noire, suis-je raison?


@Stevenjiang oui c'est vrai


@Pierre et votre objectif est de faire connaître le ScrollView zoomé et animé à une position à gauche à l'écran? Et pourriez-vous partager votre exemple de projet dans la vidéo?


@Stevenjiang je ne peux pas: / et oui c'est mon objectif


4 Réponses :


1
votes

Essayez: xxx

en dehors du bloc d'animation. Je ne crois pas que le contentoffset est animé via le bloc d'animation UIVIEW.

EDIT: Au lieu de: xxx

Essayez: xxx


3 commentaires

Non, car cela fonctionne à l'intérieur de mon bloc après un défilement avec décélération. Sans décélération, il est cassé. Et même si je le fais, le résultat serait moins agréable pour l'utilisateur (durée différente, car la mine est une constante et SetContentView: animée: n'est pas)


Hmm, d'accord ... Ce que je sens toujours comme si je ne comprends pas complètement le problème que vous rencontrez. Mais une autre façon d'animer le contentoffset est d'animer les limites. Et si vous essayez le code sur la modification, que se passe-t-il alors?


Thx mais même résultat. Regarde une ma vidéo;)



-1
votes

Essayez peut-être d'utiliser l'animation de base plutôt que des animations UIView. Il ne fera pas la différence si la raison pour laquelle vous rencontrez des ennuis est parce que toutes les animations sont supprimées du calque, mais si elle est due à - [RemoveanimationForkey: @ "limites"] code>, ceci pourrait être un gagnant.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
animation.fromValue = [NSValue valueWithCGRect:_scrollView.layer.bounds];
animation.toValue = [NSValue valueWithCGRect:(CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size }];
[scrollView.layer addAnimation:animation forKey:@"myCustomScroll"];
scrollView.layer.bounds = (CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size };


2 commentaires

Le chemin de clés est limites et vous définissez un point de la valeur, serait une erreur idiote # 1;)


Ah Yep, mon erreur. Ainsi la responsabilité de non-responsabilité.



-1
votes

Je ne suis pas sûr de comprendre complètement votre problème (vous pouvez peut-être essayer d'expliquer ce que vous voulez accomplir dans cette animation?). Toute façon, peut-être essayer cela au lieu d'utiliser setContentOffsetsset : xxx


0 commentaires

0
votes

Je soupçonne que X dans cette ligne peut entraîner l'effet que vous voyez: xxx

Qu'est-ce que c'est la valeur? Je pense que vous devriez essayer de remplacer cela par CGPointMake (0, Y) et voyez si cela provoque que la marge blanche apparaisse à chaque fois.

Mon raisonnement est le suivant:

1) à Créer un effet rebondissant qui ne sort pas de la portée de l'image (ne montre pas l'arrière-plan blanc), vous devez avoir défini _scrollview 'S contentint.Width moins que le Taille réelle de l'image.

2) Pour permettre un défilement que vous avez défini le contenu contenu.width supérieur à la largeur du _scrollview < p> 3) Vous avez centré l'image dans le _scrollview relativement à la taille de son contenu sur

4) Lorsque vous utilisez probablement un cadre avec Coordonnée X pré-calculée pour positionner l'image sur la taille de gauche car sans que catransform3dmakescale ne quitterait pas l'image au centre (en passant, pourquoi utiliser catransform3dmakescale , lorsque vous pourrait simplement changer la taille dans le cadre?)

5) dans le vid eo, lors de la première exécution de l'animation la première fois, vous avez contentoffset.x à sa valeur maximale (car vous faites glisser vers la gauche, augmentez donc le décalage de contenu et la vision de ScrollView retourner à son compensation de contenu max t aller au-delà des limites de la taille du contenu)

6) Dans la vidéo Lorsque vous exécutez l'animation pour la deuxième fois, vous avez contentoffset.x avec une valeur inférieure car vous faites glisser vers la droite En diminuant

7) Lorsque l'animation est terminée, vous avez toujours la même taille de contenu pour votre ScrollView et donc la même quantité de défilement disponible. Si vous avez le contentoffset.x à sa valeur maximale, l'image sera plus à gauche si vous avez contentoffset.x avec moins de valeur - l'image sera plus sur la droite

8) Si X dans _scrollview.Contentounffset = cgPointMake (x, y); est lié au décalage du contenu réel avant l'animation, il est logique que l'image apparaisse plus à gauche dans le premier cas et plus sur la droite dans le second cas.

Si j'ai raison, alors Voici comment vous pourriez le résoudre :

A) si vous voulez L'image toujours à apparaître sur une position x spécifique, assurez-vous de définir constante contentoffset dans l'animation.

b) Ajustez le code de cadre de calcul ( OFFRAME ) d'origine selon le contenuOffset que vous allez vous animer (on dirait maintenant, cela ne fonctionne que avec le contenu maximum de contentoffset.x).

c) Si après l'animation, vous ne voulez pas que le contenu soit défilable, assurez-vous de définir < code> _scrollview.ContSeSize = _scrollview.bounds.Size; i n le bloc d'animation.


0 commentaires