Подтвердить что ты не робот

Могу ли я анимировать свойство UIScrollView contentOffset через его слой?

Я хочу масштабировать и прокручивать UIScrollView с помощью CGPathRef. Из-за этого я предполагаю, что мне нужно оживить свойство слоя UIScrollView? Но какое свойство я мог бы оживить, чтобы это эквивалентно выполнению анимации UIView и настройке его свойства contentOffset и zoomScale?

Это не свойства CALayer.

Любые идеи относительно того, как я подхожу к этому? Опять же, просто переместите прокрутку в определенный контент и нажмите кнопку ZoomScale, но не обязательно линейно от точки A до точки B, масштабируйте A для увеличения B соответственно.

Я думал о CAKeyFrameAnimation с CGPathRef, но я не знаю, какие свойства оживить.

4b9b3361

Ответ 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 для этого конкретного класс)