iOS中如何移除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
相关产品推荐
相关产品推荐

