我一直在尝试创建一个底部工作表视图,其中包含几个视图,例如滚动视图。然而,在这部分源代码中工作正常,我发现当手指最初与滚动视图交互时,onChanged 监听器被触发,但拖动手势无法捕捉 onEnded。这就是为什么 ui 无法处理拖动结束操作的原因。我认为这是一个已知问题,但我既找不到任何可接受的解决方案,也找不到令人信服的解释。请您给我一些反馈,也许我需要改变我的观点并重新设计源代码。
谢谢。
struct UserInfoRegistrationView: View {
@ObservedObject private var viewModel: UserInfoRegistrationViewModel
@State private var offSet: CGFloat = 0
init(viewModel: UserInfoRegistrationViewModel) {
self.viewModel = viewModel
}
var body: some View {
VStack {
Spacer()
VStack(alignment: .center, spacing: 0) {
Rectangle()
.fill(Color.clear)
.frame(height: 40, alignment: .center)
ScrollView(.vertical) {
Rectangle()
.fill(Color.clear)
.frame(height: 40, alignment: .center)
VStack(alignment: .leading, spacing: 30) {
VStack(alignment: .leading, spacing: 15) {
Text("Text 1")
Text("Text 2")
Text("Text 3")
Text("Text 4")
}
.padding(.horizontal, 30)
}
.frame(height: UIScreen.main.bounds.height - 300)
}
.frame(maxWidth: .infinity)
.background(
Color.white
.ignoresSafeArea()
)
.offset(y: offSet)
.offset(y: viewModel.showSheet ? 0 : (UIScreen.main.bounds.height - 200))
.gesture(DragGesture()
.onEnded(self.onEnded(value:))
.onChanged(self.onChanged(value:)))
}
.background(
Color.black.opacity(viewModel.showSheet ? 0.4 : 0)
.ignoresSafeArea()
.onTapGesture(perform: onTapGesture)
)
}
func onTapGesture() {
withAnimation {
viewModel.showSheet.toggle()
}
}
func onChanged(value: DragGesture.Value) {
if value.translation.height > 0 {
offSet = value.translation.height
debugPresentationLayer("offset : \(offSet)")
}
}
func onEnded(value: DragGesture.Value) {
withAnimation(Animation.easeIn(duration: 0.4)) {
let height = UIScreen.main.bounds.height / 3
if value.translation.height > height {
viewModel.showSheet.toggle()
}
offSet = 0.0
}
}
}