问题描述
我有一个可扩展的底部工作表,其中包含滚动视图内的内容。当我向上滑动时,我禁用滚动视图并通过 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 (将#修改为@)