当 UIImage 改变时动画回退

Posted

技术标签:

【中文标题】当 UIImage 改变时动画回退【英文标题】:Animation Snaps back when the UIImage is changed 【发布时间】:2013-02-12 14:57:53 【问题描述】:

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

当按钮被按下时这个定时器被调用:

//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"];

我需要将图像的变化添加到动画中吗?如果有怎么办?我真的很困惑。

【问题讨论】:

【参考方案1】:

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

来自Core Animation Programming Guide:


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

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


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

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

【讨论】:

NSTimer 是我知道如何进行按住的唯一方法。你会怎么做? @Tanner 我以为定时器是用来与动画同步的;如果不是,请不要担心。 我还有一个问题很抱歉,我将如何使用 animationDidStop... 来更改 imageView 上的 UIImage?它接受一个 CAAnimation 但我只能使用 aCABasicAnimation 或完成块更改图像。谢谢 您可以在任何指定CAAnimation 的地方使用CABasicAnimation 是的,但是如何使用动画来更改 .image?

以上是关于当 UIImage 改变时动画回退的主要内容,如果未能解决你的问题,请参考以下文章

使用核心动画在屏幕上移动 UIImage

在核心动画中,红框代替 UIImage 视图移动

调用动画后 UIImage 视图重置

设置 UIImage 颜色

可以为 UISlider 的 UIImage Thumb 设置动画吗?

从 cvMat 转换为 UIImage 会改变图像