当 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 改变时动画回退的主要内容,如果未能解决你的问题,请参考以下文章