Анимированный кроссфейд UIView приводит к падению альфа ниже 1,0? - PullRequest
1 голос
/ 11 августа 2010

Я пересекаюсь между двумя видами, используя анимацию UIView.Я заметил следующий удивительный факт:

Если у меня есть (скажем) два идентичных представления в одном и том же месте, и я анимирую перекрестное затухание между ними (например, анимируем альфа от 0,0 до 1,0 на одном во время переходаот 1,0 до 0,0, с другой стороны, в той же анимации), во время анимации видимый результат дуг немного ниже непрозрачного во время анимации - это заметный артефакт, и его можно проверить, поместив какой-то другой вид за затемненными (на короткое время становится видимым во время анимации, а затем снова становится скрытым).

Я бы ожидал (используя любую кривую синхронизации анимации), что идеально спаренные альфа-переходы 0-> 1 и 1-> 0 всегда будутдобавьте чистую альфу в 1,0, и что в этой тестовой ситуации я никогда не увижу видимых изменений в альфе, хотя я это вижу.

Есть идеи, что здесь происходит?Я мог бы взломать это для «исправления», но меня больше всего интересует то, что я упускаю концептуально в смешивании.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 11 августа 2010

Два сложенных представления с добавлением альфа до 1.0 не делают то, что вы думаете, что они делают.Они умножаются, а не добавляются.

Давайте возьмем кусочек за раз.Вот фон, сияющий на 100%:

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

Теперь давайте добавим еще один вид сверху, 50% непрозрачности.Это означает, что пропускает 50% фона через

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

Что если у нас еще один 50% -ный вид сверху?

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

Другой 50% материала позади проходит через .Это означает, что 50% × 50% = 25% фонового слоя будет по-прежнему просвечивать.

Теперь, что вы действительно хотите сделать?Вы хотите, чтобы новое представление отображалось плавно, увеличивая количество, проходящее через старое представление.Так что просто сложите два вида и потушите верхний, но оставьте нижний с непрозрачностью 100% все время .В противном случае вы будете показывать часть фона во время анимации.

0 голосов
/ 11 августа 2010

Это всего лишь предположение, не имеющее оснований для фактического факта, но, поскольку альфа выражается как CGFloat, я бы не советовал пытаться предположить что-либо об этом, добавляя в точности до 1,0, учитывая сложность представления плавающих точек с этимтип точности.Вероятно, они составляют в сумме 0,99 или около того, вызывая этот артефакт.

...