iOS15设置navigationBar.isTranslucent为false致返回按钮点击区域过小无法响应
导航栏返回按钮点击区域过小问题解决方案
常见原因及对应修复方案
1. 导航栏层级存在隐形视图遮挡
使用Xcode的Debug View Hierarchy工具检查导航栏视图层级,确认是否有自定义添加的透明视图、空白视图覆盖在返回按钮默认响应区域上,透明视图同样会拦截点击事件,找到后调整层级或者移除即可。
2. 自定义返回按钮未配置足够大的热区
如果你替换了系统默认返回按钮,使用自定义UIBarButtonItem时仅给内部控件(image/label)设置了尺寸,没有给外层按钮设置足够的宽高,就会导致响应区域极小。
修复代码示例:
let backBtn = UIButton(type: .system) backBtn.setImage(UIImage(systemName: "chevron.backward")?.withTintColor(.white, renderingMode: .alwaysOriginal), for: .normal) backBtn.addTarget(self, action: #selector(backAction), for: .touchUpInside) // 主动设置为iOS推荐的最小点击热区尺寸44*44 backBtn.frame = CGRect(x: 0, y: 0, width: 44, height: 44) navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backBtn)
3. 导航栏外观配置存在版本适配问题
你当前的配置代码没有语法错误,但iOS13之后推荐使用UINavigationBarAppearance统一配置导航栏外观,避免不同系统版本的布局异常导致的响应区域偏移:
if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() // 对应你之前的isTranslucent = false配置 appearance.configureWithOpaqueBackground() appearance.backgroundColor = .black appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // 统一配置所有状态下的导航栏外观 navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance navigationController?.navigationBar.compactAppearance = appearance } else { // iOS13以下沿用原有配置 navigationController?.navigationBar.isTranslucent = false navigationController?.navigationBar.tintColor = .white navigationController?.navigationBar.barTintColor = .black navigationController?.navigationBar.barStyle = .black }
4. 手势冲突
检查当前页面是否添加了和系统返回手势冲突的自定义手势(比如全局点击手势、侧滑手势),如果有可以通过UIGestureRecognizerDelegate的代理方法设置手势优先级,允许和系统返回手势同时响应。
兜底修复方案
如果无法定位具体原因,可以通过重写点击区域判断方法针对性扩大返回按钮的热区:
// 仅针对导航栏返回按钮所在的类做拓展,避免影响全局按钮 extension UINavigationBar { open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { for subview in subviews { if NSStringFromClass(type(of: subview)).contains("UINavigationBarBackButton") { let expandRect = subview.bounds.insetBy(dx: -20, dy: -10) if expandRect.contains(convert(point, to: subview)) { return true } } } return super.point(inside: point, with: event) } }
内容的提问来源于stack exchange,提问作者teradyl
相关产品推荐
相关产品推荐

