添加 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 搜索栏在出现时向下移动

如何向 UISearchController 添加间隙?

iOS v10 或更低版本:如何以编程方式在导航栏底部添加 UISearchController

在 UISearchController 文本字段中键入时导航栏消失