ViewController中两个Swipe Gesture Recognizer仅一个生效,如何解决?
为啥右滑不用代码就行,左滑必须写代码?
兄弟,先搞清楚一个关键:你那个能正常工作的右滑返回,根本不是你手动添加的那个手势在起作用!iOS的UINavigationController本身就自带了右滑返回的交互逻辑——只要你的页面是被导航控制器push进来的,哪怕你不在ViewController上手动加任何右滑手势,用户右滑屏幕边缘(或者全屏,取决于系统设置)都能返回上一页。你手动加的那个右滑手势说不定还和系统自带的有点冲突,但因为系统的优先级更高,所以看起来还是正常工作的。
而你新增的左滑跳转手势,属于完全自定义的交互行为,系统根本不知道你想让它做什么。系统只能识别“用户做了左滑这个动作”,但它不知道左滑之后要跳转到哪个ViewController、用push还是present的方式跳转——这些逻辑必须由你自己写代码告诉它,不然手势触发了也没有任何反应。
给左滑手势加逻辑的简单方法
如果你是用Storyboard添加的手势:
按住Ctrl键,把左滑手势拖到你的ViewController代码文件里,创建一个IBAction方法,在方法里写跳转逻辑就行。举个Swift的例子:
@IBAction func onLeftSwipe(_ sender: UISwipeGestureRecognizer) { // 假设你已经在Storyboard里给目标VC设置了Storyboard ID guard let targetVC = storyboard?.instantiateViewController(withIdentifier: "YourTargetVCID") as? YourTargetViewController else { return } navigationController?.pushViewController(targetVC, animated: true) }
OC版本的话代码类似:
- (IBAction)onLeftSwipe:(UISwipeGestureRecognizer *)sender { YourTargetViewController *targetVC = [self.storyboard instantiateViewControllerWithIdentifier:@"YourTargetVCID"]; [self.navigationController pushViewController:targetVC animated:YES]; }
如果是纯代码添加的手势:
创建手势的时候要指定触发的方法,比如:
override func viewDidLoad() { super.viewDidLoad() let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(onLeftSwipe(_:))) leftSwipe.direction = .left view.addGestureRecognizer(leftSwipe) } @objc private func onLeftSwipe(_ sender: UISwipeGestureRecognizer) { // 同样写跳转逻辑 let targetVC = YourTargetViewController() navigationController?.pushViewController(targetVC, animated: true) }
最后提个小建议:你手动加的那个右滑手势其实没必要留着,系统自带的右滑返回已经很稳定了,删掉它还能避免潜在的手势冲突问题。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

