iOS 12中如何移除导航栏大标题底部边框?
iOS 12 大标题导航栏底部边框移除方案
在iOS 12中,大标题模式下的导航栏底部边框无法通过shadowImage和setBackgroundImage直接移除——这是该版本的原生行为,因为大标题导航栏的结构和普通导航栏不同,边框以私有子视图的形式存在。不过可以通过以下方式解决:
修改你现有代码的iOS 12分支,添加遍历导航栏子视图并隐藏分割线的逻辑:
func setupTransparentNavigationBar() { let textAttributes = [NSAttributedString.Key.foregroundColor: UIColor.colorWhite()] navigationController?.navigationBar.tintColor = UIColor.colorWhite() navigationController?.navigationBar.backgroundColor = UIColor.clear navigationController?.navigationBar.isTranslucent = true if #available(iOS 13, *) { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() appearance.backgroundColor = .clear appearance.titleTextAttributes = textAttributes navigationItem.standardAppearance = appearance navigationItem.scrollEdgeAppearance = appearance } else { navigationController?.navigationBar.titleTextAttributes = textAttributes navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) navigationController?.navigationBar.shadowImage = UIImage() // 处理iOS 12大标题导航栏的底部边框 if navigationController?.navigationBar.prefersLargeTitles == true { DispatchQueue.main.async { // 遍历导航栏背景视图,找到分割线 if let barBackground = self.navigationController?.navigationBar.subviews.first(where: { $0.classForCoder.description() == "_UIBarBackground" }) { let separatorView = barBackground.subviews.first(where: { $0.classForCoder.description() == "_UINavigationBarSeparatorView" }) separatorView?.isHidden = true } } } } }
注意事项
- 这里用到了iOS的私有类(
_UIBarBackground和_UINavigationBarSeparatorView),虽然在iOS 12版本中不会出现兼容性问题,但Apple不建议直接依赖私有API。不过对于已停止更新的iOS 12来说,这个方案是稳定可行的。 - 使用
DispatchQueue.main.async是为了确保导航栏的子视图已经完成布局,避免找不到目标视图的情况。
内容的提问来源于stack exchange,提问作者Jayaseelan Kumarasamy
相关产品推荐
相关产品推荐

