1

UIView アニメーションを使用して 2 つのビュー間でクロスフェードしています。次の驚くべき事実に気づきました。

同じ場所に (たとえば) 2 つの同じビューがあり、それらの間でクロス フェードをアニメートするとします (たとえば、同じアニメーションで、一方のアルファを 0.0 から 1.0 にアニメートし、もう一方のアルファを 1.0 から 0.0 にアニメートします)。これは目立つアーティファクトであり、クロスフェード ビューの背後に別のビューを配置することで確認できます (アニメーション中に一時的に表示されてから、再び不明瞭になります)。

(任意のアニメーション タイミング カーブを使用して) 0->1 と 1->0 のアルファ トランジションを完全にペアにすると、常に 1.0 のネット アルファになると予想されます。このテスト状況では、アルファ、まだあります。

ここで何が起こっているのか分かりますか?「修正」のためにこれをハックすることもできますが、主にブレンドで概念的に欠けているものに興味があります。

ありがとう!

4

2 に答える 2

6

1.0 になるアルファを追加した 2 つの積み重ねられたビューは、あなたが思っていることをしません。それらは加算ではなく乗算されます。

一度にチャンクを取りましょう。100% 透けて見える背景は次のとおりです。

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

次に、別のビューを上に追加してみましょう。不透明度は 50% です。つまり、背景の 50% を通過させます。

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

上部にさらに 50% のビューがあるとしたら?

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

背後にあるもののさらに50% が通過します。これは、背景レイヤーの 50% × 50% = 25% が透けて見えることを意味します。

さて、あなたが本当にやりたいことは何ですか?古いビューを通過する量を増やしながら、新しいビューをスムーズに表示する必要があります。そのため、2 つのビューを重ねて、上のビューをフェードアウトしますが、下のビューは常に 100% の不透明度のままにします。そうしないと、アニメーション中に背景の一部が表示されます。

于 2010-08-11T19:21:23.690 に答える
0

これは事実に基づく根拠のない推測にすぎませんが、アルファは として表現されるためCGFloat、正確に 1.0 になると仮定しようとしないことをお勧めします。合計すると .99 程度になる可能性があり、このアーティファクトが発生します。

于 2010-08-11T19:13:51.943 に答える