如何禁用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
相关产品推荐
相关产品推荐

