我有一个UIView做一个简单的动画。它将y位置从100调整到130然后反转。我希望它继续重复,所以我将重复计数器设置为999.在用户输入时,我想采用相同的UIView并调整x位置。这是通过另一个UIView动画完成的。问题是,当第二个动画开始时,第一个动画(在y方向从100到130)刚刚突然结束(因为我读到它应该)。有没有办法在UIView结束之前获得该UIView的y坐标的最终位置?理想情况下,我希望UIView保持在我翻译x坐标时所处的y位置。
总结:UIView在y方向上从100-130移动,反转并重复直到收到用户输入。收到后,动画缩短,UIView跳到y = 130。我想找到一种方法来找出动画被缩短之前的最终y值是什么,所以当使用带有x平移的新动画时,UIView不会跳到130,但保持与第1个时相同的位置动画结束了。
我似乎无法看到任何让你这样做的东西。在我看来,一旦你用UIView设置动画,那么它(以及所有当前的状态变化)都不在您的手中,只有在完成动画并且在指定时才会“返回”您的控件和可用性终点。它是否正确?任何见解将不胜感激。谢谢你的时间。
答案 0 :(得分:9)
您正在寻找“表示层”。
每个UIView都使用Core Animation层渲染,可以从UIView的layer
属性访问。
CALayer有一个presentationLayer方法,它返回一个CALayer,表示“与当前显示的图层版本非常接近”。
因此,要获取视图的当前位置:
CGRect currentViewFrame = [[myView.layer presentationLayer] frame];
答案 1 :(得分:0)
我不确定这是否正是你想要的,但是在beginAnimations块中使用的UIView的setAnimationBeginsFromCurrentState:
将导致x动画在y正在进行的任何地方开始。
答案 2 :(得分:0)
也许对于你想要实现的目标,有利于对动画进行更多的控制。对于这个任务,我建议使用NSTimer以任何最适合你的间隔(1/30到1/60)进行安排,并在每次计时器触发时调整UIView位置。这样,您始终可以访问视图位置的X和Y分量。
类似的东西:
- (void)timerFired:(NSTimer *)timer {
CGPoint p = view.center;
if (p.y >= 130.0) {
positiveMovement = NO;
}
else if (p.y <= 100.0) {
positiveMovement = YES;
}
if (positiveMovement)
p.y++;
else
p.y--;
view.center = p;
}
positiveMovement只是一个BOOL实例变量。您也可以直接使用用户输入直接调整视图位置的X值,并相应地更新。