在iOS 11中忽略设置UINavigationBar外观

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在iOS 11中忽略设置UINavigationBar外观相关的知识,希望对你有一定的参考价值。

我试图在屏幕之间设置UINavigationBar外观(tintColorbarTintColor等),但目前在ios 11中,大多数情况似乎完全被忽略或者表现不如预期。当按下或弹出视图时,单个导航控制器内的条形外观会发生变化。我有两个函数,我在viewWillAppear中调用它。

我需要能够设置标题颜色,左右栏按钮项目颜色,后退按钮颜色和条纹色调。

我正试图让这些颜色正常工作,所以我尝试了这个,但没有快乐。

public func setDarkHeaderStyle() {
    UIApplication.shared.statusBarStyle = .lightContent

    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().barTintColor = Colours.secondaryNavy
    UINavigationBar.appearance().isTranslucent = false
}

public func setLightHeaderStyle() {
    UIApplication.shared.statusBarStyle = .default

    UINavigationBar.appearance().tintColor = Colours.primaryNavy
    UINavigationBar.appearance().barTintColor = UIColor.white
    UINavigationBar.appearance().isTranslucent = false
}

Dark style Light style

如果我改为使用导航控制器设置颜色,它确实适用于条形色调,UIBarButtonItem和后退按钮,但标题不正确。

public func setDarkHeaderStyle() {
    UIApplication.shared.statusBarStyle = .lightContent

    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
    navigationController?.navigationBar.isTranslucent = false
}

public func setLightHeaderStyle() {
    UIApplication.shared.statusBarStyle = .default

    navigationController?.navigationBar.tintColor = Colours.primaryNavy
    navigationController?.navigationBar.barTintColor = UIColor.white
    navigationController?.navigationBar.isTranslucent = false
}

Dark style Light style

所以我用以下方法手动设置标题文本属性:

public func setDarkHeaderStyle() {
    UIApplication.shared.statusBarStyle = .lightContent

    navigationController?.navigationBar.titleTextAttributes = [
        NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
        NSAttributedStringKey.kern: 0.2,
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]

    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
    navigationController?.navigationBar.isTranslucent = false
}

public func setLightHeaderStyle() {
    UIApplication.shared.statusBarStyle = .default

    navigationController?.navigationBar.titleTextAttributes = [
        NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
        NSAttributedStringKey.kern: 0.2,
        NSAttributedStringKey.foregroundColor: Colours.primaryNavy
    ]

    navigationController?.navigationBar.tintColor = Colours.primaryNavy
    navigationController?.navigationBar.barTintColor = UIColor.white
    navigationController?.navigationBar.isTranslucent = false
}

这似乎有效,除非您弹回到根视图时未设置标题颜色:

Dark initial load Light initial load Dark popped

我想我有两个问题:

为什么UINavigationBar.appearance()不起作用?我怎样才能让它可靠地工作?

答案

我认为这是一个错误。 UIBarNavigationItem出于某种原因似乎忽略了对标题属性和色调颜色的更改,除非标题文本发生变化。这是一种奇怪的行为,您可以考虑报告它。解决方法可能是将空白后缀切换到标题:

// Hack!!! adds and removes an empty space to the title to 
// force the bar item reset title attributes.
let title: String = barItem.title ?? ""
barItem.title = title.hasSuffix(" ") ? String(title.dropLast()) : title + " "

以上是关于在iOS 11中忽略设置UINavigationBar外观的主要内容,如果未能解决你的问题,请参考以下文章

Safari 9(在 iOS9 中)忽略 CSS 设置

VoiceOver 是不是总是忽略宽度和高度为零的 iOS 视图?

忽略 iOS 中的动态类型:可访问性

MVC 忽略 web.config 中的文化设置

Cordova / Phonegap 忽略 iOS 中 div 的高度值

iOS - 自定义视图:在 layoutSubviews() 中更新后忽略了固有内容大小