【问题标题】:Setting UINavigationBar appearance ignored in iOS 11在 iOS 11 中设置 UINavigationBar 外观被忽略
【发布时间】:2018-08-06 01:24:11
【问题描述】:

我正在尝试在屏幕之间设置 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
}

如果我改用导航控制器设置颜色,它确实适用于条形色调、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
}

所以我手动设置标题文本属性如下:

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
}

这似乎有效,除了当你弹回到根视图时,标题颜色没有设置:

我想我有两个问题:

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

【问题讨论】:

  • 为什么不在view-contoller中使用preferredStatusBarStyle,例如在viewWillAppear(_:)方法中设置导航栏的外观?
  • 嗯,状态栏样式工作正常...这是 UINavigationBar 的标题不起作用,我在 viewWillAppear 中设置。这些函数中的每一个都在 viewWillAppear 中调用。

标签: ios swift uinavigationcontroller uinavigationbar


【解决方案1】:

我认为这是一个错误。 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 + " "

【讨论】:

  • 不幸的是,这不起作用:(。事实上,如果我在viewDidAppearviewWillAppear 中设置样式(使用此解决方法),它就可以工作。
  • 您应该只调用一次,我使用此代码一遍又一遍地切换按钮操作的颜色。您需要确保没有其他任何东西可以设置标题。
【解决方案2】:

我尝试了一些适用于我的 UIViewController 的东西(全局和当前导航栏外观):

        UINavigationBarAppearance* appearance = [[UINavigationBarAppearance alloc] init];
        appearance.backgroundColor = bgColor;
        appearance.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};

        [UINavigationBar appearance].standardAppearance = appearance;
        [UINavigationBar appearance].scrollEdgeAppearance = appearance;
        self.navigationController.navigationBar.standardAppearance = appearance;
        self.navigationController.navigationBar.scrollEdgeAppearance = appearance;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多