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
,您拥有removeAllAnimations
和removeAnimationForKey:
,您还可以查看使用-[CALayer presentationLayer]
来找出特定图层在特定屏幕上的位置指向动画,然后调整实际图层值以匹配。
【讨论】:
非常感谢!唉,在完全陷入我的项目之后,我求助于 pauseLayer:我停止动画的其他方式都有问题。感谢您解决这个问题,不幸的是我可能需要问另一个问题。再次感谢。以上是关于UIView Animation 中的 Alpha 变化没有影响,在 UIView Animation 之外很好的主要内容,如果未能解决你的问题,请参考以下文章
GradientLayer 中的 Swift -Animation 未出现在单元格中