Могу ли я анимировать свойство UIScrollView contentOffset через его слой?
Я хочу масштабировать и прокручивать UIScrollView с помощью CGPathRef. Из-за этого я предполагаю, что мне нужно оживить свойство слоя UIScrollView? Но какое свойство я мог бы оживить, чтобы это эквивалентно выполнению анимации UIView и настройке его свойства contentOffset и zoomScale?
Это не свойства CALayer.
Любые идеи относительно того, как я подхожу к этому? Опять же, просто переместите прокрутку в определенный контент и нажмите кнопку ZoomScale, но не обязательно линейно от точки A до точки B, масштабируйте A для увеличения B соответственно.
Я думал о CAKeyFrameAnimation с CGPathRef, но я не знаю, какие свойства оживить.
Ответы
Ответ 1
Вам нужно оживить свойство bounds
. Фактически, то, что свойство contentOffset
использует за кулисами.
Пример:
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;
Если вам интересно, то, как я использовал эту информацию, является следующее:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[scrollView setContentOffset:CGPointMake(200, 0) animated:NO];
[UIView commitAnimations];
NSLog(@"%@",scrollView);
Вызов NSLog
будет выводиться:
<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}>
Фрагмент animations
отобразит все активные анимации, в данном случае { bounds=<CABasicAnimation: 0xec1e7c0>; }
.
Надеюсь, что это поможет.
Ответ 2
Перемещение CALayer вокруг выполняется (предпочтительно), устанавливая его .position свойство - или, возможно, anchorPoint (cf docs на нем: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html).
... но я не думаю, что вы хотите общаться с CALayer, если работаете с UIScrollView. Вы пробовали применять простые CoreAnimations к вашему ScrollView?
(проблема в том, что UIScrollView реализован поверх CALayer - так что даже если вы можете взломать его для работы сегодня, он, скорее всего, сломается в будущих версиях iOS. Если возможно, вы хотите избежать CALayer для этого конкретного класс)