1

当按下并按住按钮时,我有一个 UIImageView 在屏幕上运行。按下按钮时会更改 UIImageView 的 UIImage,而当松开按钮时,我会将其更改为原始 UIImage。当图像变回时,它会捕捉回图像开始的位置。

按下按钮时调用此 Timer:

//This is the image that changes when the button is pressed.
imView.image = image2;
runTimer = [NSTimer scheduledTimerWithTimeInterval:0.04
                                            target:self
                                          selector:@selector(perform)
                                          userInfo:nil
                                           repeats:YES];

这称为当按钮停止被按住时:

- (IBAction)stopPerform:(id)sender{
   [runTimer invalidate];

   //THIS IS WHAT SNAPS THE ANIMATION BACK:
   //Without this the animation does not snap back
   imView.image = image1;
}

- (void)performRight{

 CGPoint point0 = imView.layer.position;
 CGPoint point1 = { point0.x + 4, point0.y };

 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position.x"];
 anim.fromValue    = @(point0.x);
 anim.toValue  = @(point1.x);
 anim.duration   = 0.2f;
 anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

 // First we update the model layer's property.
 imView.layer.position = point1;

 // Now we attach the animation.
 [imView.layer  addAnimation:anim forKey:@"position.x"];
}

我是否需要将图像更改添加到动画中?如果有怎么办?我真的很困惑。

4

1 回答 1

0

Core Animation 使用不同的属性集来表示一个对象:

来自核心动画编程指南


模型层树(或简称“层树”)是您的应用程序与之交互最多的层。此树中的对象是存储任何动画目标值的模型对象。每当您更改图层的属性时,都会使用这些对象之一。

演示树包含任何正在运行的动画的运行中值。图层树对象包含动画的目标值,而表示树中的对象反映了当前值,因为它们出现在屏幕上。您永远不应修改此树中的对象。相反,您使用这些对象来读取当前动画值,也许是从这些值开始创建一个新动画。


因此,当您为属性设置动画时,您会更改表示层,但一旦动画完成,对象将恢复为其模型属性值。

要解决此问题,您需要做的是使用[CAAnimation animationDidStop:finished:]委托方法来设置最终属性值以及您想做的任何其他事情。我认为您可以使用它来转储NSTimer您正在使用的可怕代码,并且世界的一小部分会变得更好。

于 2013-02-12T16:21:53.487 回答