Czy Mogę animować właściwość uiscrollview contentOffset za pomocą jej warstwy?

Chcę powiększać i przewijać UIScrollView za pomocą CGPathRef. Z tego powodu zakładam, że muszę animować właściwość warstwy UIScrollView? Ale jaką właściwość animować, aby uczynić to równoznaczne z wykonaniem animacji UIView i ustawieniem jej właściwości contentOffset i zoomScale ?

To nie są właściwości Kalajera.

Jakieś pomysły, jak bym do tego podszedł? Ponownie, po prostu chcesz przenieść widok przewijania do określonego contentOffset i zoomScale, ale nie koniecznie liniowo od punktu A do punktu B, odpowiednio zoom A do zoomu B.

Myślałem o CAKeyFrameAnimation z cgpathref, ale nie wiem, które właściwości animować.

Author: horseshoe7, 2011-06-30

2 answers

Musisz animować Właściwość bounds. W rzeczywistości to właśnie obiekt contentOffset wykorzystuje za kulisami.

Przykład:

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;

Jeśli jesteś ciekawy, sposób, w jaki uzyskałem te informacje, jest następujący:

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

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

[UIView commitAnimations];

NSLog(@"%@",scrollView);

Wywołanie NSLog wyjdzie:

<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}>

Fragment animations wyświetli listę wszystkich aktywnych animacji, w tym przypadku { bounds=<CABasicAnimation: 0xec1e7c0>; }.

Mam nadzieję, że to pomoże.
 51
Author: pt2ph8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 10:53:46

Przenoszenie Kalajera odbywa się przez (najlepiej) ustawienie go .position property - lub ewentualnie anchorPoint (c. f. docs on that: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html ).

...ale nie sądzę, że chcesz zadzierać z Calayerem, jeśli pracujesz z UIScrollView. Czy próbowałeś zastosować zwykłe Coreanimacje do widoku przewijania?

(problem polega na tym, że UIScrollView jest zaimplementowane na szczycie CALayer-więc nawet jeśli można włamać go do pracy dzisiaj, to jest dość prawdopodobne, aby złamać w przyszłych wersjach iOS. Jeśli to możliwe, chcesz uniknąć Kalajera dla danej klasy)

 0
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 22:32:21