添加 UISearchController 时导航栏变为白色
Posted
技术标签:
【中文标题】添加 UISearchController 时导航栏变为白色【英文标题】:Navigation bar becomes white when a UISearchController is added to it 【发布时间】:2019-09-01 13:14:28 【问题描述】:当我将 UISearchController 从 UINavigationController 添加到 UINavigationItem 时;当视图加载并更改为用户单击搜索栏时指定的颜色时,它变为白色。这发生在 ios 13.1 之后。该视频显示了这种行为:
https://imgur.com/wn5zbnJ
我的代码由一个带有 NavigationController + TableViewController 的简单故事板组成,并且 NavigationController 具有分配给它的颜色:
ViewController 由以下代码组成:
class ViewController: UITableViewController
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad()
super.viewDidLoad()
searchController.hidesNavigationBarDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false
navigationItem.searchController = searchController
我还将这些键添加到 info.plist
文件以强制应用进入轻模式,但如果我删除这些相同的行为仍然存在:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
这是在运行 iOS 13.1 beta 1 的 iPhone XS Max 上测试的。这是预期的行为还是需要修复的错误?
【问题讨论】:
你想导航栏一直是红色的吗?你想在导航栏中搜索栏吗? @YunusKarakaya 是的,我希望导航栏始终为红色;并且在导航栏中也有搜索栏。 不幸的是,我在 iOS 13.1 上有同样的行为 @Devxln 你修好了吗?我有同样的问题。 【参考方案1】:似乎需要在 iOS 13 上使用新的 UINavigationBarAppearance。尝试将其添加到您的 viewDidLoad:
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .systemRed
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
您可能还想设置 searchField backgroundColor:
let searchField = searchController.searchBar.searchTextField
searchField.backgroundColor = .systemBackground
【讨论】:
【参考方案2】:这似乎是 iOS 13.1 中的一个错误。具体来说,导航栏有一个新的 iOS 13 特定外观 (UINavigationBarAppearance),它指定滚动视图滚动到顶部时的外观以及默认状态。通常,只有在使用相应的 SDK (iOS 13.1) 构建应用程序时,此类更改才会生效。但是,似乎存在一个错误,即使用 iOS 12 SDK 构建应用程序时也会发生该行为。
见:https://developer.apple.com/documentation/uikit/uinavigationbarappearance
更新: 这里有一个解决方法:https://itnext.io/fixing-issues-caused-by-future-sdks-ae0896384abf
基本上,如果您的应用在运行 iOS 13 的设备上运行,则可以通过 NSClassFromString() 在 swift 中快速创建新类的实例,然后使用一些 Objective-c 运行时魔法来配置导航栏。
【讨论】:
好的,没有办法临时修复吗? 没有。我们不能根据使用的 SDK 导致 UIKit 的行为有所不同。一种解决方法是更改导航栏的内部背景视图,但这取决于导航栏视图层次结构的特定结构,这是一个实现细节,可能随时更改。 开发者报告此问题已在 iOS 13.2 中得到解决。【参考方案3】:您的问题并不清楚您想要什么。但是,如果您愿意,请将搜索栏添加到导航栏中并使用特定颜色,这可能会对您有所帮助。
将seachbar放入导航栏的过程:
let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController
您可以将任何您想要的控制器添加到 'searchResultsController' 值中。
如果您想将背景颜色设置为特定颜色,您可以从 Storyborad -> 导航栏 -> 导航栏属性检查中更改条形颜色。
此外,AppDelegate.swift 文件的以下代码也将执行相同的操作。 'tintcolor' 和 'titletextcolor' 被注释了
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
// Override point for customization after application launch.
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.barTintColor = UIColor.blue
// navigationBarAppearace.tintColor = UIColor.red
//navigationBarAppearace.titleTextAttributes = [.foregroundColor: UIColor.red]
return true
【讨论】:
嗨,对不起,但这也不是我的问题的答案;它与 ios 13 有关。由于 ios 13,我描述的行为发生了。即使我在 AppDelegate 中添加这些全局颜色值。 我在帖子中添加了自 ios 13.1 以来出现此问题。 @Devxln 我下载了 beta 13.1,但没有遇到意外的行为【参考方案4】:我遇到了同样的问题,并且已经向 Apple 打开了雷达。 即使,如果您将 backgroundColor 设置为 UINavigationBar 的外观,那么导航栏在下拉并显示搜索栏时会变为该颜色,而不是变为透明,但状态栏仍然保持白色。
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().barTintColor = .blue
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
UINavigationBar.appearance().backgroundColor = .red
这是一些试图减轻这种行为的代码,但我愿意听到状态栏的事情
【讨论】:
以上是关于添加 UISearchController 时导航栏变为白色的主要内容,如果未能解决你的问题,请参考以下文章
UISearchController 滑动时错误的动画然后消失
无法将 UISearchController 搜索栏添加到导航栏中,并且未调用委托方法
UISearchController 搜索栏在出现时向下移动