【问题标题】:UIView animated crossfade causes alpha to drop below 1.0?UIView 动画淡入淡出导致 alpha 低于 1.0?
【发布时间】:2011-03-28 13:21:57
【问题描述】:

我正在使用 UIView 动画在两个视图之间进行淡入淡出。我注意到以下令人惊讶的事实:

如果我在同一个地方有(比如说)两个相同的视图,并且我在它们之间制作了一个交叉淡入淡出动画(例如,在同一个动画中,将 alpha 从 0.0 动画到 1.0,而在另一个动画中从 1.0 动画到 0.0 ),在动画期间,可见结果在动画期间略低于不透明 - 这是一个明显的伪影,可以通过在交叉淡入淡出的视图后面放置一些其他视图来验证(它在动画期间短暂可见,然后再次被遮挡)。

我希望(使用 any 动画时序曲线)完美配对的 0->1 和 1->0 alpha 过渡将始终加起来为 1.0 的净 alpha,并且在这个测试中在这种情况下,我不应该看到任何可见的 alpha 变化,但我确实看到了。

知道这里发生了什么吗?我可以解决这个问题以获得“修复”,但我最感兴趣的是我在混合概念上缺少的东西。

谢谢!

【问题讨论】:

  • 如果您有解决此问题的方法,能否分享一下?

标签: iphone animation uiview alpha


【解决方案1】:

两个叠加的 alpha 值加起来为 1.0 的视图并不像您认为的那样。它们是相乘的,而不是相加的。

让我们一次取一小块。这是一个 100% 闪耀的背景:

bg
|======>
|======>
|======>
|======>

现在让我们在顶部添加另一个视图,不透明度为 50%。这意味着它允许 50% 的背景通过

bg 50%
|===|===>
|===|
|===|===>
|===|

如果我们在顶部有另外 50% 的视图怎么办?

bg 50% 50%
|===|===|===>
|===|   |
|===|===|
|===|   |

另外50% 的东西通过了。这意味着 50% × 50% = 25% 的背景层仍会显示出来。

现在,你真正想做的是什么?您希望新视图平滑显示,通过旧视图的数量增加。因此,只需堆叠两个视图,然后淡出顶部的视图,但 始终将底部保持 100% 的不透明度。否则,您将在动画期间显示一些背景。

【讨论】:

  • 你让我处于“相乘,而不是相加”的状态。 :) 谢谢,解释清楚,我希望我能给包括伟大的图表更多的点。
【解决方案2】:

这只是一个猜测,实际上没有任何依据,但由于 alpha 表示为 CGFloat,我建议不要尝试假设任何关于它的内容加起来正好等于 1.0,因为用它表示浮点数很困难精度类型。它们加起来可能会达到 0.99 左右,从而导致此伪像。

【讨论】:

  • 这比浮点精度问题更明显。根据 jtbande 的回答,它更像是 0.75 左右:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2014-01-20
  • 2012-12-18
  • 2013-01-24
  • 1970-01-01
  • 2019-02-11
相关资源
最近更新 更多