SwiftUI编辑状态下禁用TabView滑动切换问题求助
在SwiftUI中根据状态禁用TabView页面滑动切换的问题解决
你遇到的问题是iOS16下原有的子视图添加DragGesture的方案失效,核心原因是TabView的页面切换手势优先级高于子视图手势,所以子视图的手势无法拦截TabView本身的滑动逻辑。
解决方法:给TabView本身添加高优先级拦截手势
直接在TabView层级使用highPriorityGesture,当editing为true时,用空的DragGesture()抢占手势响应权,阻止底层的页面切换手势触发。
修改后的完整代码:
struct TabViewTest: View { @State var editing: Bool = false let numbers:[Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var body: some View { TabView { ForEach(numbers, id: \.self) { index in Button ("Hello, World \(index)!") { editing.toggle() print("Btn \(index) changed editing to \(editing)") } } } .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .never)) // 关键:高优先级手势拦截滑动 .highPriorityGesture(editing ? DragGesture() : nil) } }
原理说明
highPriorityGesture会让当前视图的手势优先于底层视图的手势被识别,当editing为true时,空的DragGesture()会消耗掉滑动手势,TabView的页面切换逻辑就无法接收到手势事件,从而实现禁用滑动的效果。
内容的提问来源于stack exchange,提问作者Slamit
相关产品推荐
相关产品推荐

