引言:为什么这条该死的线条让开发者彻夜难眠?
\n\n如果你曾尝试让应用设计“像 Apple Music”或“像 Telegram”——你肯定遇到过这个问题。你创建了一个完美的 UINavigationBar,带有漂亮的渐变、透明度或自定义颜色,启动模拟器——然后看到底部这条细灰色或黑色线条(1像素)。它看起来像是一个瑕疵,像玻璃上的污垢。是的,它很烦人。
这条 1px 线条不是 bug,而是特性。它是 shadowImage + backgroundImage,Apple 不知为何默认保留了它们。即使在 iOS 17 中,如果你不告诉系统:“嘿,把这个去掉”,它仍然会出现。Stack Overflow 上关于这个主题的问题获得了数千次浏览和数十个回答。这说明这个话题确实令人头疼。
\n\n在本文中,我将展示 3种有效的 Swift 方法来隐藏 UINavigationBar 的底部线条。我们将讨论旧方法(iOS 13-)以及通过 UINavigationBarAppearance 实现的现代方法。开始吧!
方法 1:经典方法——通过 backgroundImage 和 shadowImage
\n\n最古老且经过验证的方法。它从 iOS 5 开始就有效(是的,从拟物化设计流行的时代开始)。思路很简单:我们设置一个空图像作为背景和阴影。
\n\n步骤 1:创建一个空图像
\n\nextension 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\nfunc 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——线条可能会回来。
方法 2:现代方法——通过 UINavigationBarAppearance (iOS 13+)
\n\n从 iOS 13 开始,Apple 引入了 UINavigationBarAppearance。这是一个统一的对象,管理所有状态:标准、滚动和紧凑。非常适合那些想要“一次配置,永久生效”的人。
UIViewController 的完整示例
\n\nfunc 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\nlet 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——则需要