2010-08-11 1 views
1

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

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

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

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

Спасибо!

+0

Не могли бы вы поделиться решением проблемы с этим, если у вас есть? – Brackets

ответ

6

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

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

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

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

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

Что делать, если у нас есть еще один вид 50% на вершине?

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

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

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

+0

Вы меня заставили «помнить, а не добавлять». :) Спасибо, ясное объяснение, и я хотел бы дать больше очков за включение великолепных диаграмм. –

0

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

+0

Это более заметна, чем проблема с поплавковой точностью. Ответ на jtbande, он больше походил на .75 или около того :) –

Смежные вопросы