我可以通过其图层为UIScrollView contentOffset属性设置动画吗?

时间:2011-06-30 13:25:29

标签: ios uiscrollview core-animation cakeyframeanimation

我想用CGPathRef缩放和滚动UIScrollView。因此我假设我必须为UIScrollView的图层属性设置动画?但是,我将使用哪个属性设置动画,这相当于执行UIView动画并设置其contentOffset属性和zoomScale?

这些不是CALayer的属性。

关于我如何处理这个问题的任何想法?同样,只想将scrollview移动到某个contentOffset和zoomScale,但不一定是从A点到B点的线性移动,分别是缩放A到缩放B.

我在考虑使用CGPathRef的CAKeyFrameAnimation,但我不知道要设置动画的属性。

3 个答案:

答案 0 :(得分:53)

您必须为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>; }

希望这有帮助。

答案 1 :(得分:0)

移动CALayer是通过(最好)设置它的.position属性 - 或者可能是anchorPoint(c.f。上的文档:http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html)完成的。

...但如果你正在使用UIScrollView,我认为你不想搞乱CALayer。您是否尝试将纯CoreAnimations应用于ScrollView?

(问题是:UIScrollView是在CALayer之上实现的 - 所以即使你今天可以破解它,它很可能在未来的iOS版本中破解。如果可能的话,你想要避免使用CALayer类)

答案 2 :(得分:0)

雨燕4.2

此示例基于pt2ph8的on_click() { this.$emit('update:id', 1) this.$emit('update:text', 'child text') } 答案。

  

https://stackoverflow.com/a/8741283/6113158

obj-c