使用CoreAnimation在iOS中平滑动画

时间:2010-12-13 17:11:44

标签: iphone core-animation

CoreAnimation非常简单,但是:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:30];
MyImageView.frame = CGRectOffset(MyImageView.frame, 100, 0);
[UIView commitAnimations];

我想慢慢移动ImageView by 100 Pixel veeeery。因此,所有定位值都是双倍我期望Layoutsystem以亚像素精度定位项目。 但是当我观看这个动画时,我看到ImageView以像素方式“跳跃”而不是平滑的旅行。 有什么想法来实现真正的亚像素定位吗? 我还尝试用计时器设置位置并重新计算帧值,但效果相同。

更新: 在我的应用程序的另一部分中,我使用Accelerometer来更新ImageView的位置,然后基本上计算图形的位置广告大小,然后执行:

MyImageView.frame = newCGRect; 

我从Accelerometer获得了大约60次更新,并从Apple的Accelerometer示例中添加了LowPass-Filter。 这里的定位是完美的吗?!?!
为什么CoreAnimation不会发生这种情况?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用CGAffineTransformTranslate(MyImageView.transform,100,0)代替CGRectOffset。

此处参考: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html

答案 1 :(得分:0)

如果在QuartzCore框架中使用CABasicAnimation,则可以使用“CAMediaTimingFunction”平滑动画。内置替代品对我有用,但据我所知,您也可以定义自己的计时功能。

CABasicAnimation *starShineAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
starShineAnimation.removedOnCompletion = NO;
starShineAnimation.fillMode = kCAFillModeForwards;
starShineAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
....