【SwiftUI】transition効果が機能しないケース

Viewオブジェクトの表示・非表示の切り替え時のアニメーションを定義するtransitionモディファイアは、animationとセットで使用する必要があります。
しかしながら、animationの指定方法によってtransitionが正しく機能しないケースがあるようです。
本記事では、transitionが機能しないケースを紹介します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】11.5
【Swift】5.2.4
【iOS】13.5
【macOS】Catalina バージョン 10.15.4

ケース1:Viewに暗黙的なanimationを指定

Viewに対して暗黙的なアニメーションを指定したケースでは、一部のtransition効果が機能しません。
次のコードを実行して、「トランジション」ボタンをクリックすると、青い円がアニメーション効果を伴って表示・非表示が切り替わります。
しかし、transitionのオプションを.scaleまたは.opacityに変更すると、アニメーションが機能しません。

一部のサイトや書籍では「Appleはtransitionを明示的なanimationと一緒にしか使用できないように変更した」との情報もあるので、このケースでは機能しない方が正しい仕様なのかもしれません。

ケース2:AnyTransitionインスタンスにanimation適用

Appleの公式リファレンスマニュアルを見ると、AnyTransitionのインスタンスに、直接animationモディファイアを使用できると書いてあります。
次のコードを実行すると確かにそれは機能するのですが、transitionのオプションを.slideに変更すると機能しなくなります。
このケースでは、先程のケースとは逆で、.scaleまたは.opacity以外のオプションがなぜか機能しなくなるようです。

回避策

transitionを使用する場合は、次のコードように明示的なアニメーション指定をすると良いです。
プロパティに対する明示的なアニメーション指定の場合は、確認した限りすべてのtransitionオプションが正常に機能します。

あわせて読みたい記事

【SwiftUI】トランジション(transition)の使い方
Viewオブジェクトの表示・非表示切り替えに伴うアニメーションをトランジション(transition)と呼びます。SwiftUIでは、トランジション用に通常のアニメーション処理とは別の仕組みが用意されています。