10

TabView でスワイプ可能な長押しジェスチャを検出しようとしています。

問題は、現時点で TabView のスワイプ可能な動作が無効になっていることです。個々の VStack にジェスチャを適用しても機能しませんでした。背景をタップしても長押しが検出されません。

これは私のコードの簡略化されたバージョンです - Swift Playground にコピーして貼り付けることができます:

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    @State var currentSlideIndex: Int = 0
    @GestureState var isPaused: Bool = false
    
    var body: some View {
        
        let tap = LongPressGesture(minimumDuration: 0.5,
                                   maximumDistance: 10)
            .updating($isPaused) { value, state, transaction in
                state = value
            }
        
        Text(isPaused ? "Paused" : "Not Paused")
        TabView(selection: $currentSlideIndex) {
            VStack {
                Text("Slide 1")
                Button(action: { print("Slide 1 Button Tapped")}, label: {
                    Text("Button 1")
                })
            }
            VStack {
                Text("Slide 2")
                Button(action: { print("Slide 2 Button Tapped")}, label: {
                    Text("Button 2")
                })
            }
        }
        .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
        .frame(width: 400, height: 700, alignment: .bottom)
        .simultaneousGesture(tap)
        .onChange(of: isPaused, perform: { value in
            print("isPaused: \(isPaused)")
        })
    }
}

PlaygroundPage.current.setLiveView(ContentView())

全体的な考え方としては、この TabView はスライドを自動的に回転させますが、いずれかのスライドを指で押さえると回転が一時停止するはずです (Instagram のストーリーと同様)。簡単にするためにそのロジックを削除しました。

更新: DragGesture の使用も機能しませんでした。

4

2 に答える 2