0

我一直在尝试创建一个底部工作表视图,其中包含几个视图,例如滚动视图。然而,在这部分源代码中工作正常,我发现当手指最初与滚动视图交互时,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
        
    }
    
}

}

4

0 回答 0