Swift中Navigation Controller Bar Button隐藏及添加后被遮挡问题咨询
刚踩过类似的坑,帮你梳理下这两个问题的核心原因:
一、Bar Button突然隐藏的常见诱因
- 导航栏被全局隐藏:你大概率在某个地方设置了
navigationController?.isNavigationBarHidden = true,或者在Storyboard里勾了「Hide Navigation Bar」选项——整个导航栏都没了,按钮自然跟着隐身。 - 按钮加错了地方:如果是手动写代码加按钮,别直接把
UIButton丢到当前控制器的view里!得通过navigationItem来绑定,比如navigationItem.rightBarButtonItem = xxx,不然按钮根本不属于导航栏的一部分,当然看不到。 - 颜色“隐身”坑:要是导航栏的
tintColor(控制按钮文字/图标颜色)和导航栏背景色完全一致,按钮其实是存在的,只是和背景融为一体,看起来像被隐藏了。 - 自动隐藏手势搞的鬼:如果开了
navigationController?.hidesBarsOnSwipe或hidesBarsOnTap,滑动/点击屏幕时导航栏会自动收起,按钮也会跟着消失,可能你没留意这个设置。
二、添加的Bar Button跑到导航栏后方的核心原因
这个问题本质是视图层级搞反了,常见场景:
- 直接把按钮加到导航控制器的view上:很多新手会写
navigationController?.view.addSubview(myButton),但导航控制器的view层级里,系统导航栏是处于上层的子视图,你手动加的按钮会被导航栏覆盖,所以看起来在后方。正确姿势是通过navigationItem的left/rightBarButtonItem属性来添加,或者用setLeftBarButton(_:animated:)这类系统方法。 - 自定义导航栏的层级冲突:如果你替换了系统导航栏,或者给导航栏加了自定义的UIView,可能自定义视图的
zPosition比按钮高,或者添加顺序在按钮之后,导致按钮被遮挡。这种情况要检查自定义导航栏的视图层级,确保按钮在导航栏视图的上层。 - 用UIButton直接硬塞到导航栏区域:别直接把
UIButton放到导航栏的frame范围内!要把UIButton包装成UIBarButtonItem再添加,系统导航栏会优先处理自身的UIBarButtonItem,直接加UIButton很容易被压在导航栏下面。
附正确添加Bar Button的示例代码
// 方式1:直接创建UIBarButtonItem let doneButton = UIBarButtonItem(title: "完成", style: .done, target: self, action: #selector(doneButtonTapped)) navigationItem.rightBarButtonItem = doneButton // 方式2:自定义UIButton包装成UIBarButtonItem let customBtn = UIButton(type: .system) customBtn.setTitle("自定义", for: .normal) customBtn.addTarget(self, action: #selector(customBtnTapped), for: .touchUpInside) let customBarItem = UIBarButtonItem(customView: customBtn) navigationItem.leftBarButtonItem = customBarItem
内容的提问来源于stack exchange,提问作者ToniTJK
相关产品推荐
相关产品推荐

