如何在添加UISearchController后移除UINavigationBar下方阴影
我之前也碰到过这个坑——UISearchController确实会悄悄干扰导航栏的阴影设置!你之前用shadowImage = UIImage()移除阴影的方法本身没问题,但当你把搜索控制器添加到导航栏后,系统内部会重置导航栏的部分样式,导致阴影又冒出来了。
核心解决方案
要彻底解决这个问题,你需要同时设置导航栏的shadowImage和backgroundImage,并且把这些配置放在UISearchController初始化完成之后执行。这样可以覆盖搜索控制器带来的样式重置。
完整代码示例(不透明导航栏)
如果你的导航栏需要保持白色不透明,用这段代码:
override func viewDidLoad() { super.viewDidLoad() // 第一步:配置你的UISearchController let searchController = UISearchController(searchResultsController: nil) searchController.obscuresBackgroundDuringPresentation = false searchController.searchBar.placeholder = "输入搜索内容..." self.navigationItem.searchController = searchController // 第二步:移除导航栏阴影的关键设置 self.navigationController?.navigationBar.shadowImage = UIImage() // 设置空背景图配合阴影图移除效果 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) // 保持导航栏背景色为白色 self.navigationController?.navigationBar.barTintColor = .white // 关闭半透明(如果需要不透明效果) self.navigationController?.navigationBar.isTranslucent = false }
半透明导航栏的情况
如果你需要导航栏保持半透明效果,只需要调整isTranslucent为true,同时按需调整背景相关设置:
override func viewDidLoad() { super.viewDidLoad() let searchController = UISearchController(searchResultsController: nil) searchController.obscuresBackgroundDuringPresentation = false self.navigationItem.searchController = searchController // 半透明导航栏移除阴影 self.navigationController?.navigationBar.isTranslucent = true self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) }
为什么之前的尝试会有异常?
- 单独设置
setBackgroundImage而不配合shadowImage:系统默认会在导航栏底部显示阴影,仅设置背景图无法覆盖这个默认行为。 - 设置
isTranslucent = false时出现布局异常:这是因为导航栏半透明状态和不透明状态下,控制器的view布局起点会变化(半透明时view从屏幕顶部开始,不透明时从导航栏底部开始),如果你的布局没有适配这个变化,就会出现偏移或重叠问题。
内容的提问来源于stack exchange,提问作者Affinity
相关产品推荐
相关产品推荐

