DragGesture
やonTapGesture
といったGesture
を使用して、スワイプ検知であったり、TextField
のフォーカス解除といった場面で、画面全体を検知できる方法を調べてみました。
どういった場合に機能しないのか
VStackにそのまま記述
VStack
に記述したら全体に反映されると思いきや、VStack
内のView
のサイズしか反応しませんでした。VStack
の大きさを指定していないので、Text
の大きさの中でしか検知できません。
ダメな例
VStack {
Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
VStack
の大きさを指定して、.contentShape()
を指定してあげると画面全体で検知できるようになります。
正しい例
VStack {
Text("SecondView")
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.contentShape(Rectangle())
.navigationBackButton()
.edgeSwipe()
透明なViewに記述
透明なView
を背景にすれば大丈夫かと思えばそうでもなかったみたいです。しかしclear
ではなく色をつけると反応するようになります。SwiftUIでは透明のView
に対しては反応しないようになっています。
ダメな例
ZStack {
Color.clear
Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
正しい例
Color.clear
に対して、contentShape
をつけることで正しく動作します。
ZStack {
Color.clear
.contentShape(Rectangle())
Text("SecondView")
}
.navigationBackButton()
.edgeSwipe()
終わりに
たったのcontentShape
ひとつだけで変わるので忘れないようにしたいです。記事を投稿してすぐにコメント下さった方に感謝します。