UINavigationController导航栏中心图片设置后不显示问题排查
解决导航栏中心图片无法显示的问题
我来帮你排查这个导航栏图片不显示的问题,你的代码里有几个关键的地方需要调整,咱们一步步来:
问题分析
错误的
navigationController判断逻辑
在UINavigationController的子类里,navigationController属性指的是它的父级导航控制器,而不是自身。你写的if navigationController == nil会导致:如果当前导航控制器没有父导航,直接跳过整个setupView逻辑,这显然不是你想要的效果。初始化时机过早
在init(coder:)方法里调用setupView时,视图还没完成布局,navigationBar的frame还不是最终的实际尺寸——这时候你计算出来的图片位置和大小都是错误的,自然看不到图片。titleView设置对象错误
导航栏显示的是当前栈顶控制器(topViewController)的navigationItem,而不是UINavigationController自身的navigationItem。你之前设置的是自己的navigationItem,所以不会在界面上显示出来。
修正后的代码
把布局逻辑移到viewDidLayoutSubviews(确保视图布局完成后获取正确的frame),同时修正上述问题:
class NavBarImg: UINavigationController { required init(coder aDecoder: NSCoder){ super.init(coder: aDecoder)! } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() setupView() } func setupView(){ // 确保导航栏存在,避免空值崩溃 guard let navigationBar = self.navigationBar else { return } let image = #imageLiteral(resourceName: "BarTabsNavLogoWhite") let imageView = UIImageView(image: image) // 基于导航栏实际尺寸计算图片居中位置 let navBarWidth = navigationBar.frame.size.width let navBarHeight = navigationBar.frame.size.height // 让图片居中显示,imageView尺寸设为图片实际大小(也可以根据需求调整) imageView.frame = CGRect( x: (navBarWidth - image.size.width) / 2, y: (navBarHeight - image.size.height) / 2, width: image.size.width, height: image.size.height ) imageView.contentMode = .scaleAspectFit // 将titleView设置给栈顶控制器的navigationItem,这样才会在导航栏显示 self.topViewController?.navigationItem.titleView = imageView } }
额外检查点
除了代码调整,还有几个地方可以验证:
- 确认
BarTabsNavLogoWhite图片确实存在于你的项目中,并且已经勾选了对应的Target Membership(在文件检查器里查看)。 - 可以临时给
imageView加个背景色(比如imageView.backgroundColor = .red),看看是否能看到红色块——如果能看到,说明是图片资源的问题;如果看不到,再检查布局逻辑。 - 如果你的导航栏有自定义背景或者其他子视图,确保
imageView的层级足够高,不会被遮挡。
内容的提问来源于stack exchange,提问作者Vincent Joseph
相关产品推荐
相关产品推荐

