如何移除 UINavigationBar 底部线条:3种有效方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么这条该死的线条让开发者彻夜难眠?

\n\n

如果你曾尝试让应用设计“像 Apple Music”或“像 Telegram”——你肯定遇到过这个问题。你创建了一个完美的 UINavigationBar,带有漂亮的渐变、透明度或自定义颜色,启动模拟器——然后看到底部这条细灰色或黑色线条(1像素)。它看起来像是一个瑕疵,像玻璃上的污垢。是的,它很烦人。

\n\n

这条 1px 线条不是 bug,而是特性。它是 shadowImage + backgroundImage,Apple 不知为何默认保留了它们。即使在 iOS 17 中,如果你不告诉系统:“嘿,把这个去掉”,它仍然会出现。Stack Overflow 上关于这个主题的问题获得了数千次浏览和数十个回答。这说明这个话题确实令人头疼。

\n\n

在本文中,我将展示 3种有效的 Swift 方法来隐藏 UINavigationBar 的底部线条。我们将讨论旧方法(iOS 13-)以及通过 UINavigationBarAppearance 实现的现代方法。开始吧!

\n\n

方法 1:经典方法——通过 backgroundImage 和 shadowImage

\n\n

最古老且经过验证的方法。它从 iOS 5 开始就有效(是的,从拟物化设计流行的时代开始)。思路很简单:我们设置一个空图像作为背景和阴影。

\n\n

步骤 1:创建一个空图像

\n\n
extension UIImage {\n    static func pixelImage(withColor color: UIColor = .clear) -> UIImage {\n        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)\n        UIGraphicsBeginImageContext(rect.size)\n        color.setFill()\n        UIRectFill(rect)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        return image ?? UIImage()\n    }\n}
\n\n

步骤 2:应用到 navigationBar

\n\n
func hideBottomLine() {\n    let emptyImage = UIImage.pixelImage()\n    navigationController?.navigationBar.setBackgroundImage(emptyImage, for: .default)\n    navigationController?.navigationBar.shadowImage = emptyImage\n}
\n\n

优点: 在所有地方都有效,甚至包括旧版 iOS。
\n缺点: 与 scrollEdgeAppearance 和大标题配合时不一定正确。如果你有 UISearchBar——线条可能会回来。

\n\n

方法 2:现代方法——通过 UINavigationBarAppearance (iOS 13+)

\n\n

从 iOS 13 开始,Apple 引入了 UINavigationBarAppearance。这是一个统一的对象,管理所有状态:标准、滚动和紧凑。非常适合那些想要“一次配置,永久生效”的人。

\n\n

UIViewController 的完整示例

\n\n
func setupTransparentNavigationBar() {\n    let appearance = UINavigationBarAppearance()\n    appearance.configureWithTransparentBackground()\n    appearance.backgroundColor = .clear\n    appearance.shadowColor = .clear  // 移除线条\n    \n    navigationController?.navigationBar.standardAppearance = appearance\n    navigationController?.navigationBar.scrollEdgeAppearance = appearance\n    navigationController?.navigationBar.compactAppearance = appearance\n}
\n\n

请注意:shadowColor = .clear 是关键代码行。如果不写这一行,线条会保留。 configureWithTransparentBackground() 使背景透明,但不会影响阴影。

\n\n

如果你需要彩色背景但不要线条:

\n\n
let appearance = UINavigationBarAppearance()\nappearance.configureWithOpaqueBackground()\nappearance.backgroundColor = .systemBlue\nappearance.shadowColor = .clear\n\nnavigationController?.navigationBar.standardAppearance = appearance\nnavigationController?.navigationBar.scrollEdgeAppearance = appearance
\n\n

优点: 代码简洁,易于与大标题和搜索功能组合。
\n缺点: 仅支持 iOS 13+。如果项目支持 iOS 12——则需要

博客

书籍推荐