SwiftUI で画面遷移を行うための方法に .sheet
や .fullScreenCover
、 NavigationLink
などがありますが、いずれもデフォルトでアニメーションがついています。このアニメーションはほとんどの場合にはありがたいですが、ときには邪魔になることがあります。
disablesAnimation
を true
にした Transaction の中で画面遷移を発生させることでアニメーションなしで遷移させることができます。
var transaction = Transaction()
transaction.disablesAnimations = true
withTransaction(transaction) {
// ここで画面遷移を発生させる
}
具体例として、 .fullScreenCover
のアニメーションを無効にしたものを示します。 .sheet
や NavigationLink
にも同様の方法が使えます。
struct ContentView: View {
@State private var isPresented: Bool = false
var body: some View {
VStack {
Button(action: {
// NOTE: ここで表示アニメーションを無効にしている
var transaction = Transaction()
transaction.disablesAnimations = true
withTransaction(transaction) {
isPresented = true
}
}) {
Text("FullScreenCover")
}
}
.fullScreenCover(isPresented: $isPresented) {
FullScreenView()
}
}
}
struct FullScreenView: View {
@Environment(\.dismiss) var dismiss
var body: some View {
ZStack {
Color.black.ignoresSafeArea()
Button(action: {
// NOTE: ここで非表示アニメーションを無効にしている
var transaction = Transaction()
transaction.disablesAnimations = true
withTransaction(transaction) {
dismiss()
}
}) {
Text("Close")
.foregroundColor(.white)
}
}
}
}
通常の .fullScreenCover
|
^ のコードでアニメーションを無効にしたもの |
---|---|
以上です。
この記事は Transaction の機能のうちの一部しか使っていません。Transaction の基礎知識や一般的な使い方については以下の記事がわかりやすいと思います。