1

我发现至少 5 个其他“UIView 动画不起作用”问题,我不想再添加一个。:(。我确定这不是特定于alpha. 的问题。与 . 相同的问题backgroundColor。所以它是基本的。

这有效:

        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

这没有(它什么都不做):

 //kPlayView and kCancelView are subviews of kTapViewTag  
 [UIView animateWithDuration:2.0  animations:^{
        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

    } ];

为什么?这在kTapViewTag视图的手势处理程序中调用。backgorundColor = [UIColor clearColor]我想淡化为白色并将子视图的 alpha 更改为 0.75 以响应点击手势。

更新:

反向工作。这有效:

       [UIView animateWithDuration:2.0 animations:^{
          [self.view viewWithTag:kPlayView].alpha = 0;
          [self.view viewWithTag:kCancelView].alpha = 0;
          [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

我能够在没有动画的情况下显示充当“暂停/恢复”的视图,然后为淡出设置动画。只要我不尝试为淡入设置动画,这就会来回工作。

更新 2

这是整个实现以供参考。这里有什么?(我看了太多次了)。

- (void)didTap:(id)selector
{

    isPaused = (isPaused) ? NO: YES;

    [self.view viewWithTag:kPlayView].userInteractionEnabled = isPaused;
    [self.view viewWithTag:kCancelView].userInteractionEnabled = isPaused;

    if (isPaused)
    {

        [self pauseLayer:self.view.layer];
        [timer1 invalidate];
        [timer2 invalidate];

       [UIView animateWithDuration:2.0  animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0.75;
            [self.view viewWithTag:kCancelView].alpha = 0.75;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];
        } ];
    }
    else
    {
        isPaused = NO;

        [UIView animateWithDuration:2.0 animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0;
            [self.view viewWithTag:kCancelView].alpha = 0;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

        [self resumeLayer:self.view.layer];
        [self animateNotification];
    }         
}

更新 3

- (void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

- (void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}
4

1 回答 1

1

UIView 动画是核心动画的一个很好的高级包装器,它使用你的视图层来渲染它的动画。通过将图层速度设置为 0,您可以有效地停止 uiview 动画的启动。

当您再次启动图层时,您将从停止的位置开始。暂停之前和之后的动画合并,没有任何反应。

当您不制作动画时,动画在另一个方向工作的原因是动画的设置和触发方式。你打电话时[UIView animate...它时,它会在图层上设置一个低级动画,其中包含开始时间和结束时间等。您编写的代码立即完成,动画将在下一次运行循环时开始。但是,在您让一切都返回之前,您还可以恢复图层的时间和速度,因此在制作动画时,一切都会正常进行。

我的猜测是您并不是要像这样暂停图层。必须有更好的方法来删除和停止动画。例如,UIView您只需再次为该属性设置动画,它就会停止,您CALayer可以查看使用,以找出特定图层在动画中特定点在屏幕上的位置,然后调整实际图层值以匹配。removeAllAnimationsremoveAnimationForKey:-[CALayer presentationLayer]

于 2012-11-09T22:03:59.743 回答