与自定义视图控制器一起使用时,UINavigationBar 的 UIAppearance 不起作用...?

Posted

技术标签:

【中文标题】与自定义视图控制器一起使用时,UINavigationBar 的 UIAppearance 不起作用...?【英文标题】:UIAppearance for UINavigationBar not working when used with custom view controller...? 【发布时间】:2016-04-28 10:53:17 【问题描述】:

我有一个设置 UINavigationBar 外观的方法。 FlightSearchViewController 是 UIViewController 的子类,但导航栏未按预期更新。如果我写 UIViewController 代替 FlightSearchViewController 一切正常。

private class func setupNavigationBarAppearance() 
        UINavigationBar.appearance().barStyle = .Black
        UINavigationBar.appearance().translucent = false
        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor(), NSFontAttributeName: UIFont.ixiRegularFontOfSize(17)]
        UINavigationBar.appearance().tintColor = UIColor.clearColor()
        UINavigationBar.appearance().barTintColor = Color.navBarThemeColor

        var navBarAppearanceControllers = [AnyObject.Type]()
        navBarAppearanceControllers.append(FlightSearchViewController.self)
        let navBarAppearance = UINavigationBar.appearanceWhenContainedInInstancesOfClasses(navBarAppearanceControllers)
        navBarAppearance.barTintColor = UIColor.clearColor()
        navBarAppearance.backgroundColor = UIColor.clearColor()
        navBarAppearance.tintColor = UIColor.clearColor()
        navBarAppearance.setBackgroundImage(UIImage(), forBarMetrics: .Default)
        navBarAppearance.shadowImage = UIImage()
        navBarAppearance.translucent = true
        navBarAppearance.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor(), NSFontAttributeName: UIFont.ixiRegularFontOfSize(17)]
    

【问题讨论】:

您正在尝试更改特定 viewController 的导航栏颜色。对吗? 是的......和其他事情 【参考方案1】:

您的导航栏不包含在FlightSearchViewController 中,而是位于视图控制器层次结构中的上方。 'appearanceWhenContainedInInstancesOfClasses' 表示您的 viewController 中包含的 UINavigationBar 将得到更新。但它不是这样,因为导航栏包含在 UINavigationController 中。

如果你尝试

let navBarAppearance = UINavigationBar.appearanceWhenContainedInInstancesOfClasses([UIViewController.self]),它会工作的。但是,您会在每个视图控制器上看到更改。

【讨论】:

【参考方案2】:

你可以尝试替换吗:

    var navBarAppearanceControllers = [AnyObject.Type]()
    navBarAppearanceControllers.append(FlightSearchViewController.self)
    let navBarAppearance = UINavigationBar.appearanceWhenContainedInInstancesOfClasses(navBarAppearanceControllers)
    navBarAppearance.barTintColor = UIColor.clearColor()
    navBarAppearance.backgroundColor = UIColor.clearColor()
    navBarAppearance.tintColor = UIColor.clearColor()
    navBarAppearance.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    navBarAppearance.shadowImage = UIImage()
    navBarAppearance.translucent = true
    navBarAppearance.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor(), NSFontAttributeName: UIFont.ixiRegularFontOfSize(17)]

与:

    UINavigationBar.appearance().barTintColor = UIColor.clearColor()
    UINavigationBar.appearance().backgroundColor = UIColor.clearColor()
    UINavigationBar.appearance().tintColor = UIColor.clearColor()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().translucent = true
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor(), NSFontAttributeName: UIFont.italicSystemFontOfSize(17)]

【讨论】:

有问题的代码已经使用了 UINavigationBar.appearance()。 appearanceWhenContainedInInstancesOfClasses 用于覆盖必要视图。

以上是关于与自定义视图控制器一起使用时,UINavigationBar 的 UIAppearance 不起作用...?的主要内容,如果未能解决你的问题,请参考以下文章

将 SharedElement Activity 转换与自定义视图一起使用

在 Forms UWP 中,自定义标题视图中的内容视图的后退导航无法与自定义渲染器一起正常工作

nstableview 拖放与自定义单元格视图

将 FirebaseUI-IOS 与自定义 UICollectionViewCell 一起使用时出错

将 Qt 与自定义 MinGW 一起使用

将 serverless 和 serverless-domain-manager 与自定义域一起使用时的证书问题