我正在使用UIView动画在两个视图之间交叉淡入淡出。我注意到以下令人惊讶的事实:
如果我在相同的位置有两个相同的视图,并且我在它们之间设置交叉淡入淡出动画(例如,在一个动画中将alpha从0.0设置为1.0,而在另一个动画中将动画从1.0设置为0.0,在同一动画中),在动画期间,可见结果在动画期间略微低于不透明 - 这是一个明显的伪像,可以通过在交叉渐变视图后面放置一些其他视图来验证(在动画再次被遮挡之前,它会在动画期间短暂可见)。
我希望(使用任何动画时序曲线)完美配对0-> 1和1-> 0 alpha转换总是加起来为1.0的净alpha值,并且在这个测试情况下,我永远不会看到alpha中有任何明显的变化,但我确实如此。
知道这里发生了什么吗?我可以通过破解这个“修复”,但我最感兴趣的是在混合中我在概念上缺少的东西。
谢谢!
答案 0 :(得分:6)
alphas加起来为1.0的两个堆叠视图不符合你的想法。它们是相乘的,而不是相加的。
让我们一次把它当成一大块。这是一个背景,闪耀100%:
bg
|======>
|======>
|======>
|======>
现在让我们在顶部添加另一个视图,50%不透明度。这意味着它可以让50%的背景通过
bg 50%
|===|===>
|===|
|===|===>
|===|
如果我们还有另外50%的观点怎么办?
bg 50% 50%
|===|===|===>
|===| |
|===|===|
|===| |
其他 50%的内容通过传递。这意味着50%×50%= 25%的背景图层仍将显示。
现在,你真的想做什么?您希望新视图显示顺畅,通过旧视图的数量越来越多。所以只需叠加两个视图,淡出顶部视图,但一直保持底部100%不透明度。否则你将在动画中显示一些背景。
答案 1 :(得分:0)
这只是一个实际上没有基础的猜测,但由于alpha表示为CGFloat
,我建议不要尝试假设它完全加起来1.0,因为代表浮点数有困难具有这种精度。它们可能会增加到0.99左右,造成这种神器。