Swift 3导航栏自定义图标显示异常问题求助
解决Swift 3导航栏按钮图标不显示的问题
嘿,我之前也踩过这个坑!你遇到的这种“编辑器里能显示,真机/模拟器只显示按钮形状”的情况,大多是图片渲染模式或者导航栏按钮设置逻辑的问题,给你几个实用的解决方向:
1. 修正图片的渲染模式
默认情况下,UIImage会以**模板模式(Template)**渲染,这种模式会忽略图片本身的颜色,只保留形状,用导航栏的tintColor来着色。如果你的图标是带颜色的,一定要改成原始模式:
方式一:代码里设置
override func viewDidLoad() { super.viewDidLoad() // 加载图片并设置渲染模式为原始 guard let backIcon = UIImage(named: "你的图标名称")?.withRenderingMode(.alwaysOriginal) else { return } // 设置返回按钮 navigationItem.backBarButtonItem = UIBarButtonItem(image: backIcon, style: .done, target: nil, action: nil) }
方式二:在Assets中直接配置
选中你的图标文件,打开右侧的Attributes Inspector,找到「Render As」选项,改成「Original Image」即可,这样代码里不用额外设置渲染模式。
2. 检查导航栏的tintColor设置
如果导航栏的tintColor和背景色过于接近,或者被设置为透明,也会导致图标“看不见”。可以手动指定一个明显的颜色:
override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.tintColor = .systemBlue // 换成你想要的颜色 }
3. 确认按钮的设置逻辑是否正确
注意:backBarButtonItem是用来设置下一个页面的返回按钮样式的!如果当前页面是导航栈的根控制器,或者你想修改当前页面的左侧按钮,应该用leftBarButtonItem,并手动绑定返回事件:
override func viewDidLoad() { super.viewDidLoad() guard let backIcon = UIImage(named: "你的图标名称")?.withRenderingMode(.alwaysOriginal) else { return } // 创建自定义左侧按钮 let backButton = UIBarButtonItem(image: backIcon, style: .plain, target: self, action: #selector(popCurrentVC)) navigationItem.leftBarButtonItem = backButton } // 手动实现返回逻辑 @objc private func popCurrentVC() { navigationController?.popViewController(animated: true) }
4. 清理缓存重新构建
有时候Xcode的缓存会导致资源加载异常,试试这几步:
- 按下
Cmd + Shift + K清理Build Folder - 重启模拟器
- 卸载真机上的App后重新安装
内容的提问来源于stack exchange,提问作者asterix_jv




