3
[UIView beginAnimations:nil context:NULL]; // animate the following:
gearKnob.center = startedAtPoint;
[UIView setAnimationDuration:0.3];
[UIView commitAnimations];

这是动画,它将 UIImageView (gearKnob) 从一个点移动到另一个点。问题是当物体移动时,我需要相应地改变背景,所以我需要在它移动时跟踪每个 UIImageView 的位置。如何跟踪它的位置?有什么方法或委托可以做到这一点吗?

4

3 回答 3

9

如果你真的需要,这里有一个有效的方法。诀窍是使用 CADisplayLink 计时器并从 layer.presentationLayer 读取动画属性。

@interface MyViewController ()
...
@property(nonatomic, strong) CADisplayLink *displayLink;
...
@end

@implementation MyViewController {

- (void)animateGearKnob {

   // invalidate any pending timer
   [self.displayLink invalidate];

   // create a timer that's synchronized with the refresh rate of the display
   self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateDuringAnimation)];
   [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

   // launch the animation
   [UIView animateWithDuration:0.3 delay:0 options:0 animations:^{

       gearKnob.center = startedAtPoint;

   } completion:^(BOOL finished) {

       // terminate the timer when the animation is complete
       [self.displayLink invalidate];
       self.displayLink = nil;
   }];
}

- (void)updateDuringAnimation {

    // Do something with gearKnob.layer.presentationLayer.center

}

}
于 2014-01-24T22:27:13.270 回答
1

正如大卫所写,您最好并行运行第二个动画。

如果您需要使用计时器对某些东西进行伪动画处理,您可能需要尝试CPAccelerationTimer,它允许您为回调设置 Bézier 时序曲线。

如果你真的必须,你应该能够在gearKnob.layer.presentationLayer.center. -[CALayerpresentationLayer]返回的层是“当前显示在屏幕上的层的近似值。当动画正在进行时,您可以检索此对象并使用它来获取这些动画的当前值。”</p>

于 2013-01-31T10:08:04.000 回答
0

在这种情况下,您不能使用直接动画您必须使用自己的计时器并移动旋钮使用:NSTimer timerWithTimeInterval:并在选择器中移动旋钮并获取位置

于 2013-01-31T09:56:23.350 回答