1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【SwiftUI】Gestureの検知できる領域について

Last updated at Posted at 2023-11-02

DragGestureonTapGestureといった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ひとつだけで変わるので忘れないようにしたいです。記事を投稿してすぐにコメント下さった方に感謝します。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?