iOS Swift:如何禁用UITabBarController的滑动关闭功能?
解决UITabBarController Page Curl转场误关闭问题
这个问题我之前做项目时也碰到过,本质是Page Curl转场默认自带了边缘拖拽触发关闭的系统手势,咱们直接在嵌入的视图控制器里处理掉就行,给你两个简便的方案:
方案一:直接禁用系统关闭手势
在每个嵌入UITabBarController的视图控制器类中,重写viewDidAppear方法,找到并禁用触发关闭的边缘手势:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard let tabBarController = self.tabBarController else { return } // 遍历TabBarController视图上的所有手势,禁用边缘拖拽手势 tabBarController.view.gestureRecognizers?.forEach { gesture in if gesture is UIScreenEdgePanGestureRecognizer { gesture.isEnabled = false } } }
这个方法最直接,一次性关掉所有可能触发关闭的边缘手势,确保点击或滑动顶部区域不会误触发TabBarController关闭。
方案二:拦截手势触发(更灵活)
如果想保留其他手势功能,只是阻止误关闭的触发,可以通过手势代理来拦截:
- 首先在视图控制器的
viewDidLoad中设置自己为TabBarController手势的代理:
override func viewDidLoad() { super.viewDidLoad() self.tabBarController?.view.gestureRecognizers?.forEach { $0.delegate = self } }
- 遵守
UIGestureRecognizerDelegate协议,重写手势触发判断方法:
extension YourViewController: UIGestureRecognizerDelegate { func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { // 阻止边缘拖拽手势触发 if gestureRecognizer is UIScreenEdgePanGestureRecognizer { return false } // 允许其他正常手势工作 return true } }
如果需要更精细的控制(比如只阻止顶部区域的手势),还可以在gestureRecognizerShouldBegin里添加触摸位置的判断,比如:
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { if let edgeGesture = gestureRecognizer as? UIScreenEdgePanGestureRecognizer { let touchPoint = edgeGesture.location(in: view) // 当触摸点在视图顶部100pt范围内时,阻止手势 if touchPoint.y < 100 { return false } } return true }
选其中一个方案就行,方案一操作最简单,适合直接彻底解决问题;方案二更灵活,适合有特殊手势需求的场景。
内容的提问来源于stack exchange,提问作者matador0227
相关产品推荐
相关产品推荐

