2013-02-04 58 views
0

我想通过在动画块中增加UIView的x属性来在屏幕上移动UIView。我希望元素不断移动,因此我不能只指定结尾x并延长持续时间。UIView上的平滑帧动画

此代码有效,但非常不稳定。在模拟器中看起来不错,但在设备上起伏不定。

-(void)moveGreyDocumentRight:(UIImageView*)greyFolderView 
{ 
[UIView animateWithDuration:0.05 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ 
    NSInteger newX = greyFolderView.frame.origin.x + 5.0; 
    greyFolderView.frame = CGRectMake(newX, greyFolderView.frame.origin.y, greyFolderView.frame.size.width, greyFolderView.frame.size.height); 
    } 
} completion:^(BOOL finished) { 
    [self moveGreyDocumentRight:greyFolderView]; 
}]; 

}

+0

请参阅:http://stackoverflow.com/questions/5690141/how-to-do-a-continuous-recycling-uiview-animation – magma

+0

如果您只是在两个位置之间来回移动,则“ UIViewAnimationOptionAutoreverse'和'UIViewAnimationOptionRepeat'为标准的'animateWithDuration:delay:options:animations:completion:'block animation将完成这项工作。将它与'UIViewAnimationOptionCurveEaseInOut'结合起来,并且“转身”过程也将顺利进行。如果您想做其他事情(例如,不在两个地点之间),请告诉我们,我们可以建议其他选择。 – Rob

回答

3

你在这里战斗的视图动画。每个动画都包含一个UIViewAnimationOptionCurveEaseInOut时序曲线。这意味着,每0.05秒你尝试提高你的速度,然后减慢你的速度,然后改变到别的地方。

第一个也是最简单的解决方案可能会通过选项UIViewAnimationOptionCurveLinear更改为线性定时。这就是说,每5ms制作一个新的动画确实与Core Animation的角度相冲突,使代码变得复杂并且损害了性能。发送帧到你的地方目前想要它去。无论何时你想将它送到其他地方(即使它仍然在动画),将它发送到通过选项UIViewAnimationOptionBeginFromCurrentState的新地方。它会自动适应新的目标。如果您希望它重复动画或来回弹跳,请使用重复选项(UIViewAnimationOptionRepeatUIViewAnimationOptionAutoreverse)。

+0

这正是解决方案。动画每0.05秒一点都不是问题。非常光滑和性感:) – kgibbon