簡體   English   中英

SwiftUI | 如果被 ScrollView 取消,則不會調用 DragGestures onEnded

[英]SwiftUI | DragGestures onEnded never called if canceled by ScrollView

我有以下問題。

我在ScrollView中有一個要拖動的View 現在,一切正常,發生拖動和滾動。 但是,一旦我嘗試同時執行這兩項操作,則dragOffset似乎會保持dragOffset ,而不是重置為其初始位置。

onEnded是, DragGesture onEnded永遠不會發生。 如何阻止這種情況發生並將綠色Rectangle重置為其初始位置?

視覺表現

拖動或滾動工作得很好。

但是每當我同時做這件事時,就會發生這種情況。

演示代碼

struct ContentView: View {
    
    @State private var dragOffset: CGSize = .zero
    
    
    var body: some View {
        ScrollView {
            Rectangle()
                .frame(width: UIScreen.main.bounds.size.width, height: 300)
                .foregroundColor(.green)
                .offset(x: dragOffset.width)
        }
        .gesture(DragGesture()
            .onChanged { value in
                dragOffset = value.translation
            }
            .onEnded { value in
                dragOffset = .zero
            }
        )
        .animation(.default)
    }
}

謝謝!

解決方案是將.updatingGestureState一起使用。 無論出於何種原因取消手勢后,它都會自動將偏移設置為其初始位置。

這樣,我們獨立於調用onEnded將其設置為初始位置,當您通過滾動取消手勢時不會發生這種情況。

代碼:

struct ContentView: View {
    
    @GestureState private var dragOffset: CGSize = .zero
    
    
    var body: some View {
        ScrollView {
            Rectangle()
                .frame(width: UIScreen.main.bounds.size.width, height: 300)
                .foregroundColor(.green)
                .offset(x: dragOffset.width)
        }
        .gesture(DragGesture()
            .updating($dragOffset) { value, state, transaction in
                state = value.translation
            }
        )
        .animation(.default)
    }
}

注意:您當然仍然可以有一個onChangedonEnded塊,您只是不必.zero偏移量設置為.zero因為它會自動發生。

更新

如果您要在ObservableObject類中使用它並希望發布 dragOffset,那么這將是我找到的解決方案

我認為scrollView有自己的手勢,比如UIScrollViewPanGestureRecognizer中的 UIScrollViewPanGestureRecognizer,在scrollView上添加DragGesture會混淆它。

你可以稍微改變你的代碼:

var body: some View {
    ScrollView {
        Rectangle()
            .frame(width: UIScreen.main.bounds.size.width, height: 300)
            .foregroundColor(.green)
            .offset(x: dragOffset.width, y: dragOffset.height)
            .gesture(DragGesture()
                .onChanged { value in self.dragOffset = value.translation }
                .onEnded { value in self.dragOffset = .zero }
        )
    }
    .animation(.default)
}

我認為它可以很好地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM