为什么UISearchController更改导航栏颜色?

时间:2019-10-22 01:10:26

标签: ios swift uisearchcontroller

我已经在示例项目中对此进行了测试,该示例项目使用Xcode 11(iOS 13)在情节提要中定义了2个视图控制器。 “演示”视图控制器嵌入在导航控制器中,并在viewWillAppear中设置了导航栏颜色。 “搜索”视图控制器在UISearchController中添加一个viewDidLoad,并由当前视图控制器推动(非模态)。

仅通过这种设置,当显示搜索视图控制器时,导航栏将具有预期的蓝色背景和红色。但是,当向下滚动并显示搜索栏时,导航栏的背景颜色会丢失(或更改为默认的iOS灰色/半透明外观)。但是,如果您向上滚动(隐藏搜索栏)或专注于搜索栏文本字段,则导航栏颜色会返回!

此外,如果您专注于搜索栏文本字段,然后取消(通过点击“取消”按钮),导航栏的色调颜色将从红色还原为默认的iOS蓝色,如后栏项所示。

Navigation Bar on Load

Navigation Bar on Search

Focus on Search Bar

Cancel Search Bar

有任何解决此问题的建议吗?

我也在搜索控制器的viewWillAppear中设置了导航栏颜色,但这并没有改变这种行为。

我将搜索控制器中导航栏的isTranslucent设置为true,这似乎可以防止背景颜色的还原,但是在取消时它并没有改变色调的还原。

>

呈现视图控制器

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    navigationController?.navigationBar.barTintColor = .blue
    navigationController?.navigationBar.tintColor = .red
}

Search View Controller

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Search VC"

    searchController.dimsBackgroundDuringPresentation = false
    searchController.obscuresBackgroundDuringPresentation = false

    navigationItem.searchController = searchController

    definesPresentationContext = true
}

编辑

按建议设置scrollEdgeAppearancebackButtonAppearancebuttonAppearance可以有效,但是系统栏按钮默认为iOS蓝色。可以通过设置UINavigationBar.tintColor来解决此问题,但都不能解决取消搜索后默认返回的后退按钮V形颜色。

Navigation Bar on Cancel

if #available(iOS 13.0, *) {
    let buttonAppearance = UIBarButtonItemAppearance()
    buttonAppearance.configureWithDefault(for: .plain)
    buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.red]

    let navigationBarAppearance = UINavigationBarAppearance()
    navigationBarAppearance.configureWithOpaqueBackground()
    navigationBarAppearance.backgroundColor = .blue
    navigationBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.red]

    navigationBarAppearance.backButtonAppearance = buttonAppearance
    navigationBarAppearance.buttonAppearance = buttonAppearance
    navigationBarAppearance.doneButtonAppearance = buttonAppearance

    navigationController?.navigationBar.scrollEdgeAppearance = navigationBarAppearance
    navigationController?.navigationBar.compactAppearance = navigationBarAppearance
    navigationController?.navigationBar.standardAppearance = navigationBarAppearance
} else {
    navigationController?.navigationBar.barTintColor = .blue
    navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.red]
    navigationController?.navigationBar.tintColor = .red
}

1 个答案:

答案 0 :(得分:1)

  

但是,当向下滚动并显示搜索栏时,导航栏的背景颜色会丢失

所有这些都是正常的。 iOS 13中的新增功能,扩展后的导航栏(显示搜索栏,大标题等)与普通导航栏的外观不同。您的设置仅适用于普通导航栏,因为您没有将它们设置为iOS 13方式。如果要使扩展的导航栏看起来像普通导航栏,则必须分别并明确地设置其外观。

为此,您需要设置导航栏的scrollEdgeAppearance。研究类UIBarAppearance,UINavigationBarAppearance和UIBarButtonItemAppearance(您需要显式设置backButtonAppearance)。

相关问题