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

iOS中如何移除Navigation Bar阴影?已尝试代码无效求解决方案

解决Navigation Bar线条和阴影无法移除的问题

你的问题出在设置时机和操作对象不对:你把导航栏外观配置放在了pushViewController之后,且用全局的UINavigationBar.appearance()设置,这时候新页面的导航栏已经初始化完成,全局配置不会立即生效;另外全局设置会影响所有导航栏,不如直接操作当前导航控制器的实例精准。

下面给你两种可行的解决方式:

方式一:在目标页面的viewDidLoad中配置

把移除线条阴影的代码放到DetailViewController的加载方法里,确保页面初始化时就生效:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 移除导航栏底部线条和阴影
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    // 配合透明背景的可选设置
    navigationController?.navigationBar.backgroundColor = .clear
    navigationController?.navigationBar.isTranslucent = true
    
    // 配置返回按钮等其他样式
    let backImg = UIImage(named: "backArrowWhite")
    navigationController?.navigationBar.backIndicatorImage = backImg
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImg
    navigationController?.navigationBar.tintColor = .black
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

方式二:在push页面之前配置当前导航栏

如果要在原页面的didSelectRow里操作,调整顺序,先配置导航栏再push页面,且直接操作当前导航控制器的实例:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let stroryboard = UIStoryboard.init(name: "Main", bundle: nil)
    let rootVC = stroryboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
    if let data = arrlist.object(at: indexPath.row) as? NSDictionary{
        rootVC.dictData = data
    }
    
    // 先配置导航栏样式
    let backImg = UIImage(named: "backArrowWhite")
    navigationController?.navigationBar.backIndicatorImage = backImg
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImg
    navigationController?.navigationBar.tintColor = .black
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    
    // 移除线条和阴影:直接操作当前导航栏实例
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.backgroundColor = .clear
    navigationController?.navigationBar.isTranslucent = true
    
    // 最后push页面
    self.navigationController?.pushViewController(rootVC, animated: true)
}

额外提醒

  • 如果还是有冲突,检查导航栏的barStyle设置,比如设置为.blackTranslucent可以更好配合透明效果;
  • 尽量避免全局appearance()和实例设置混用,全局设置适合统一整个App的导航栏样式,单个页面的调整直接操作对应导航栏实例更稳妥。

内容的提问来源于stack exchange,提问作者heli bhadeshiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:54:32