UIView Animation 中的 Alpha 变化没有影响,在 UIView Animation 之外很好

Posted

技术标签:

【中文标题】UIView Animation 中的 Alpha 变化没有影响,在 UIView Animation 之外很好【英文标题】:Alpha changes within UIView Animation have no effect, fine outside of UIView Animation 【发布时间】:2012-11-09 18:51:15 【问题描述】:

我发现至少 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;

【问题讨论】:

运行动画块时会发生什么?屏幕上有什么变化吗? 感谢jackslash。绝对没有任何反应,没有明显的变化。但是附加了 UITapGestureRecognizer (kTapViewTap) 的视图不再响应点击。查看更新了解更多信息。 我使用此处提供的信息设置了一个示例项目,但我无法复制您的问题。只要您的标签常量是唯一的,上面的代码就是正确的。 有意见的渠道不是更好吗?通过标签查找视图是如此...脆弱 再次感谢,我更新了整个实现而不是摘录。我在某处错过了大局。邮件层上的动画使用 Apple 技术暂停,这似乎是一个危险信号,但在第二个动画中也是如此,即有效的动画。 【参考方案1】:

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

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

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

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

【讨论】:

非常感谢!唉,在完全陷入我的项目之后,我求助于 pauseLayer:我停止动画的其他方式都有问题。感谢您解决这个问题,不幸的是我可能需要问另一个问题。再次感谢。

以上是关于UIView Animation 中的 Alpha 变化没有影响,在 UIView Animation 之外很好的主要内容,如果未能解决你的问题,请参考以下文章

UI Animation 动画效果

GradientLayer 中的 Swift -Animation 未出现在单元格中

谈UIView Animation编程艺术

Tween Animation----Alpha渐变透明度动画

核心动画——Core Animation

核心动画——Core Animation