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

UINavigationController导航栏中心图片设置后不显示问题排查

解决导航栏中心图片无法显示的问题

我来帮你排查这个导航栏图片不显示的问题,你的代码里有几个关键的地方需要调整,咱们一步步来:

问题分析

  1. 错误的navigationController判断逻辑
    在UINavigationController的子类里,navigationController属性指的是它的父级导航控制器,而不是自身。你写的if navigationController == nil会导致:如果当前导航控制器没有父导航,直接跳过整个setupView逻辑,这显然不是你想要的效果。

  2. 初始化时机过早
    在init(coder:)方法里调用setupView时,视图还没完成布局,navigationBar的frame还不是最终的实际尺寸——这时候你计算出来的图片位置和大小都是错误的,自然看不到图片。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:47