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

如何禁用UIKit导航栏返回按钮长按显示空白矩形的行为

解决UIKit导航栏返回按钮长按显示空白矩形的问题

下面提供几种可行方案,均能保留返回按钮的样式与点击返回功能,仅取消长按弹出空白矩形的行为:

方案一:自定义导航栏返回按钮

直接替换系统默认的返回按钮,完全掌控按钮行为,系统自带的长按菜单自然不会触发:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 创建自定义返回按钮
    let backButton = UIButton(type: .system)
    backButton.setImage(UIImage(systemName: "chevron.left"), for: .normal)
    backButton.setTitle("返回", for: .normal)
    backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
    backButton.sizeToFit()
    
    // 包装为UIBarButtonItem并设置为左侧按钮
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

@objc private func backAction() {
    navigationController?.popViewController(animated: true)
}

该方案的优势是可以自由定制按钮样式,同时彻底避免系统的长按逻辑。

方案二:禁用系统返回按钮的长按手势识别器

无需替换按钮,直接找到系统为返回按钮添加的长按手势并禁用:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    // 递归遍历视图,找到并禁用长按手势
    func disableLongPress(in view: UIView) {
        for subview in view.subviews {
            subview.gestureRecognizers?.forEach { gesture in
                if gesture is UILongPressGestureRecognizer {
                    gesture.isEnabled = false
                }
            }
            disableLongPress(in: subview)
        }
    }
    
    navigationController?.navigationBar.flatMap(disableLongPress)
}

注意要在viewDidAppear中执行,因为导航栏的子视图在viewDidLoad阶段可能尚未完全加载完成。此方案保留了系统返回按钮的原有样式与点击逻辑。

方案三:全局禁用(谨慎使用)

如果需要全局范围内取消该行为,可通过外观代理处理,但注意此方法会同时禁用侧滑返回手势:

// 在AppDelegate/SceneDelegate的启动方法中设置
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UINavigationBar.appearance().isInteractivePopGestureRecognizerEnabled = false
    return true
}

若需保留侧滑返回,不建议使用此方案,优先选择方案二针对单个导航栏处理。

内容的提问来源于stack exchange,提问作者Omar N Shamali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:01