0

当我在 UIView.animate 块中多次设置图层不透明度时,我看到了一个意外的初始条件:

movingView.frame = CGRect(x: 120, y: 120, width: 100, height: 100)
movingView.backgroundColor = UIColor.blue

opacityView.backgroundColor = UIColor.red
opacityView.layer.opacity = 0.5

DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
    UIView.animate(withDuration: 3.0) {
        opacityView.layer.opacity = 0
        opacityView.layer.opacity = 1

        movingView.frame = CGRect(x: 10, y: 120, width: 100, height: 100)
        movingView.frame = CGRect(x: 190, y: 120, width: 100, height: 100)
    }
}

当这段代码在操场上运行时,蓝色(底部)正方形动画从视图中间到右边缘,正如预期的那样,即使框架最初设置为左侧位置,也只使用最后一个值动画。

然而,红色方块不会直接从 0.5 不透明度动画到 1.0。它首先跳到 0.0 不透明度,没有动画,然后动画到 1.0 不透明度。

显然这是一个人为的情况,但是当我只为一组元素中的一个设置动画时遇到了这种情况,我将所有元素设置为不透明度 0,然后将我希望可见的动画设置为不透明度 1。但这并没有给出预期的动画。我可以通过从所有项目列表中删除我希望显示的项目来解决此问题。

但我很好奇,想了解这里发生了什么,为什么不透明度行为与动画帧值不同,以及是否有另一种更清洁的方法来解决这个问题。

============================================

为了清楚起见,我知道什么会使这项工作,但这是一个人为的例子,为了使它在现实世界中工作,我的代码变得不必要地复杂。我想知道为什么它会表现出这种行为,以及为什么它与动画帧不同。

4

1 回答 1

0

如果我理解您的期望,您希望将视图从 0.5 变为 0,然后变为 1。为此,您应该使用两个动画。触发第一个,然后添加一个完成处理程序来触发第二个。

此外,您可以尝试使用 alpha 而不是不透明度。

我希望它有帮助。

于 2017-07-09T21:10:05.110 回答