0

我需要淡入淡出图像,在某些情况下我需要停止动画并反转它。例如:图像开始从 alpha 0 淡入到 1,然后在 0.4,由于某些用户输入,我需要将其淡出,从 0.4 到 0;

我尝试使用 animateWithDuration 和 stopAllAnimations,但结果是动画跳转到目标 alpha (= 1)。

想到了CADisplayLink,自己一帧一帧地做动画,后来看了觉得性能不太好。我尝试使用 CALayers 和 PresentationLayer,但它变得复杂,并且无法正常工作。

最好的方法是什么?任何人都可以通过一个小例子来帮助我吗?

4

3 回答 3

2

UIView animateWithDuration 方法在幕后的图层上创建 Core Animation 对象以使动画正常工作。CAAnimation 动画视图层的presentationLayer。您可以查询表示层以获取动画进行时的状态。

这是我的建议:

像现在这样使用 animateWithDuration:animations: 。

如果您需要在飞行中停止动画,请获取视图层的表示层,并捕获 alpha 属性的值。

然后将视图的不透明度设置为“in-flight”值并向图层发送 removeAllAnimations 消息。这将产生在当前状态停止动画的效果。

最后,使用新的反向动画调用新的 animateWithDuration:animations: 语句。

于 2012-11-22T16:28:27.483 回答
1

我使用此代码淡入淡出

-(void)fadeOut:(UIView*)viewToDissolve withDuration:(NSTimeInterval)duration
       andWait:(NSTimeInterval)wait FadeLevel:(float) fadeLevel
{
    [UIView beginAnimations: @"Fade Out" context:nil];
    [UIView setAnimationDelay:wait];
    [UIView setAnimationDuration:duration];
    viewToDissolve.alpha = fadeLevel;
    [UIView commitAnimations];
}

-(void)fadeIn:(UIView*)viewToFadeIn withDuration:(NSTimeInterval)duration
      andWait:(NSTimeInterval)wait FadeLevel:(float) fadeLevel
{
    [UIView beginAnimations: @"Fade In" context:nil];
    [UIView setAnimationDelay:wait];
    [UIView setAnimationDuration:duration];
    viewToFadeIn.alpha = fadeLevel;
    [UIView commitAnimations];
}

只需在将采用浮点数的方法上添加一个额外的变量,然后将淡入或淡出设置为您想要的任何内容。希望有帮助!

编辑:只是更改了代码以向您展示它的外观,只是自己测试了一下,似乎工作得很好

于 2012-11-22T14:58:40.120 回答
0

要停止动画,我所做的是使用参数调用新的 UIView 动画: UIViewAnimationOptionBeginFromCurrentState 以便它覆盖以前的动画。

所以我有一种方法可以将动画从 X 值启动到 Y 值。另一种方法可以中断第一个动画。每当我点击“暂停”按钮时,都会调用第二种方法。

当我想恢复动画时,我会再次调用 start animations 方法,使用对象所在状态的新 X 和 Y 值。

以块格式为我的 UIImageView 对象设置动画的代码:

[UIView animateWithDuration: 5
                      delay: 0.0
                    options: UIViewAnimationOptionCurveLinear
                 animations: ^{

                                  self.center = destinationPosition;  

                             }
                 completion:nil];

这是停止/中断代码:

UIImageView *currentPosition = [[UIImageView alloc] initWithFrame:[[self.layer presentationLayer] frame]];

                destinationPosition.x = currentPosition.center.x;
                destinationPosition.y = currentPosition.center.y;

                [UIView animateWithDuration: 0.1
                                      delay: 0.0
                                    options: UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState
                                 animations: ^{

                                     self.center = destinationPosition;

                                 } completion:nil];

在这段代码中,我使用图层表示方法来了解对象在动画期间的最后一个值,因此我可以在用户恢复游戏时从该点开始制作动画。这是因为该对象似乎存储了预计的目标值,我不得不用“此刻”值更新它。

请注意,停止动画代码的持续时间仅为 0.1。所以它就像新动画从它被发现的状态(UIViewAnimationOptionBeginFromCurrentState)覆盖了初始动画。该值非常短,因此它恰好将动画“停止”在它所在的位置。

我不知道这是否是最好的方法,但它对我来说很好。

于 2012-11-22T16:56:24.843 回答