有没有办法禁用 ScrollView 触发 Sheets Interactive Dismissal?

问题描述

我有一个可扩展的底部工作表,其中包含滚动视图内的内容。当我向上滑动时,我禁用滚动视图并通过 DragGesture() 调整模态表的偏移量,并且仅在容器模态完全呈现时启用滚动视图。

当我试图向下滑动模态以关闭它时,问题就出现了。如果我在滚动视图内容完全滚动到顶部时开始滑动,它会“捕获”并触发下方的 Apple 工作表(当前显示我的自定义底部工作表)以开始交互式关闭

有没有人知道有什么方法可以指定不允许特定滚动视图触发交互式解除,或任何其他潜在的方法

参考代码

struct ExpandableBottomSheet: ViewModifier {
    
    enum ViewState {
        case full
        case half
    }
    
    @GestureState private var dragState = DragState.inactive
    @State private var positionOffset: CGFloat = 0.0
    @State private var viewState = ViewState.half
    @State private var scrollOffset: CGFloat = 0.0
    
    @Binding var isShow: Bool
    
    func body(content: Content) -> some View {
        GeometryReader { geometry in
            vstack {
                Spacer()
                
                HandleBar()
                
                ScrollView(.vertical) {
                   
                    GeometryReader { scrollViewProxy in
                        Color.clear.preference(key: ScrollOffsetKey.self,value: scrollViewProxy.frame(in: .named("scrollview")).minY)
                    }
                    .frame(height: 0)
                    
                    content
                    .offset(y: -self.scrollOffset)
                    .animation(nil)
                }
                .background(Color(.systemBackground))
                .cornerRadius(10,antialiased: true)
                .disabled(self.viewState == .half)
                .coordinateSpace(name: "scrollview")
                
            }
            .offset(y: geometry.size.height/2 + self.dragState.translation.height + self.positionOffset)
            .offset(y: self.scrollOffset)
            .animation(.interpolatingSpring(stiffness: 200.0,damping: 25.0,initialVeLocity: 10.0))
            .edgesIgnoringSafeArea(.all)
            .onPreferenceChange(ScrollOffsetKey.self) { value in
                print("Preference ScrollOffsetKey Changed")
                if self.viewState == .full {
                    self.scrollOffset = value > 0 ? value : 0

                    if self.scrollOffset > 120 {
                        self.positionOffset = 0
                        self.viewState = .half
                        self.scrollOffset = 0
                    }
                }
            }
            .gesture(DragGesture()
                .updating(self.$dragState,body: { (value,state,transaction) in
                    print("Updating DragGesture: \(value.translation)")
                    state = .dragging(translation: value.translation)
                    })
                .onEnded({ (value) in
                    if self.viewState == .half {
                        // Threshold #1
                        // Slide up and when it goes beyond the threshold
                        // change the view state to fully opened by updating
                        // the position offset
                        if value.translation.height < -geometry.size.height * 0.25 {
                            self.positionOffset = -geometry.size.height/2 + 50
                            self.viewState = .full
                        }
                        
                        // Threshold #2
                        // Slide down and when it goes pass the threshold
                        // dismiss the view by setting isShow to false
                        if value.translation.height > geometry.size.height * 0.3 {
                            self.isShow = false
                        }
                    }
                  
                })
            )
            
            
        }
    }
}

struct ScrollOffsetKey: PreferenceKey {
    typealias Value = CGFloat
    
    static var defaultValue = CGFloat.zero
    
    static func reduce(value: inout Value,nextValue: () -> Value) {
        value += nextValue()
    }
}

enum DragState {
    case inactive
    case pressing
    case dragging(translation: CGSize)
    
    var translation: CGSize {
        switch self {
        case .inactive,.pressing:
            return .zero
        case .dragging(let translation):
            return translation
        }
    }
    
    var isDragging: Bool {
        switch self {
        case .pressing,.dragging:
            return true
        case .inactive:
            return false
        }
    }
    
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...