You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:22:04