web-dev-qa-db-fra.com

Puis-je animer la propriété UIScrollView contentOffset via son calque?

Je souhaite effectuer un zoom et faire défiler un UIScrollView avec un CGPathRef. À cause de cela, je suppose que je dois animer la propriété layer de UIScrollView? Mais quelle propriété puis-je animer serait équivalente à faire une animation UIView et à définir sa propriété contentOffset et son échelle de zoom?

Ce ne sont pas des propriétés d'un CALayer.

Des idées sur la façon dont j'aborderais cela? Encore une fois, vous voulez simplement déplacer le défilement vers un certain contentOffset et zoomScale, mais pas nécessairement de manière linéaire du point A au point B, zoomez A pour zoomer B, respectivement.

Je pensais à CAKeyFrameAnimation avec un CGPathRef, mais je ne sais pas quelles propriétés animer.

24
horseshoe7

Vous devez animer la propriété bounds. En fait, c’est ce que la propriété contentOffset utilise en coulisse.

Exemple:

CGRect bounds = scrollView.bounds;

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
animation.duration = 1.0;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.fromValue = [NSValue valueWithCGRect:bounds];

bounds.Origin.x += 200;

animation.toValue = [NSValue valueWithCGRect:bounds];

[scrollView.layer addAnimation:animation forKey:@"bounds"];

scrollView.bounds = bounds;

Si vous êtes curieux, voici comment je obtenais cette information:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];

[scrollView setContentOffset:CGPointMake(200, 0) animated:NO];

[UIView commitAnimations];

NSLog(@"%@",scrollView);

L'appel NSLog générera:

<UIScrollView: 0x860ba20; frame = (-65.5 0; 451 367); clipsToBounds = YES; autoresize = W+RM+TM+H; animations = { bounds=<CABasicAnimation: 0xec1e7c0>; }; layer = <CALayer: 0x860bbc0>; contentOffset: {246, 0}>

L'extrait animations liste toutes les animations actives, dans ce cas { bounds=<CABasicAnimation: 0xec1e7c0>; }.

J'espère que cela t'aides.

53
pt2ph8

Le déplacement d'une CALayer est fait en définissant (de préférence) sa propriété .position - ou éventuellement le anchorPoint (cf la documentation à ce sujet: http://developer.Apple.com/library/ios/#documentation/GraphicsImaging/Reference/ CALayer_class/Introduction/Introduction.html ).

... mais je ne pense pas que vous vouliez jouer avec CALayer si vous travaillez avec UIScrollView. Avez-vous essayé d'appliquer des CoreAnimations simples à votre ScrollView?

(Le problème est le suivant: UIScrollView est implémenté au-dessus de CALayer. Ainsi, même si vous pouvez le pirater pour qu’il fonctionne aujourd’hui, il risque fort de tomber en panne dans les futures versions iOS. Si possible, vous voulez éviter le CALayer pour cette classe particulière).

0
Adam