xcode 7.3 swift 访问和更改导航栏中的颜色和文本

xcode 7.3 swift Access and change colors and text in a navigation bar

我正在尝试学习如何在我的一个视图控制器(UIViewController,手动添加导航栏,我的故事板上没有导航控制器)中访问和更改主题颜色和字体。

我在我的视图控制器 viewDidLoad:

中使用这段代码取得了部分成功
UINavigationBar.appearance().backgroundColor = theme.TabsColor
UINavigationBar.appearance().barTintColor = theme.NavColor

但是这段来自另一个 post 的代码在 SO compiles/works 上,但没有效果:

self.navigationController?.navigationBar.translucent = false

我连简单的事情都没有成功,比如更改导航栏项目的背景颜色,使用像这样的简单代码:

for view1 in UINavigationBar.appearance().subviews {
  view1.backgroundColor = theme.CellColor
  for view2 in view1.subviews {
    view2.backgroundColor = theme.CellColor
    for view3 in view2.subviews {
      view3.backgroundColor = theme.CellColor
      for view4 in view3.subviews {
        view4.backgroundColor = theme.CellColor
      }
    }
  }
}

为了查找 StackView 项并为其着色,我在故事板上给了它们一个 restorationIdentifer,然后我可以在我的搜索循环中找到它们。但是 Nav bars 没有 restorationIdentifiers,因此该方法将不起作用。

如何从我的控制器中访问和关闭导航栏中的 .translucent?

如何访问和修改导航栏上添加到视图控制器的内容的颜色和文本属性? (我使用的是没有导航控制器的导航栏。)

如何访问和修改我整个应用程序中所有导航栏(使用导航控制器)上的颜色和文本?

谢谢。我希望一个 post 的问题不会太多,但所有的问题都指向同一件事——如何在 swift 2.2 中访问导航栏(有和没有控制器)..(有2011-2014 年 ObjC 导航栏上有不少 posts,但它们对我帮助不大。

更新:我对导航栏的理解有了更多进步。

最明显的飞跃(这让我觉得自己像个真正的新手,我支持 xcode/swift)是我可以轻松地通过为它创建一个出口来轻松获得对我的导航栏的代码引用。呸!然后我可以直接通过出口引用它,而不是使用涉及 UINavigationBar 或 self.navigationController?.navigationBar 等的复杂引用

  @IBOutlet weak var NavBar: UINavigationBar!

遵循仅使用简单插座的想法,也可以通过插座以相同的方式引用导航栏标题。

@IBOutlet weak var NavTitle: UINavigationItem!

所以这是一种用于在 Swift 中更改 NavBar 和 NavTitle 背景颜色的代码。 (实际上,下面的 backgroundColor 代码似乎没有用,并且对我的项目的视觉效果为零。实际上是 barTintColor 改变了我的 NavBar 的颜色。)

    // turning off translucent doesn't help
NavBar.translucent = false
NavBar.backgroundColor = theme.NavColor

// barTintColor actually colors the bar
NavBar.barTintColor = theme.NavColor
NavBar.tintColor = UIColor.redColor() // colors the builtin back arrow

所以我可以使用 outlets 来引用 NavBar 和 NavTitle(也可能是 NavBarItems),并且可以使用 barTintColor(但不是 backgroundColor)更改 NavBar 的背景。我可以使用 NavBar.tintColor.

更改 NavItem backItem 的颜色

但我仍然无法弄清楚如何更改 NavTitle 文本的颜色、字体等,无论是通过使用 NavBar 之类的引用...随便什么还是 NavTitle...随便什么。我认为答案不知何故在 titleTextAttributes 字典中,但我无法在网上或 Apple (swift) 文档中找到代码示例。我尝试了下面的代码(在 SO 上从 ObjC posting 中抄袭),但它似乎没有用(无效)。所以我仍然坚持如何更改标题文本的前景、背景颜色或字体等

    //    NavBar.titleTextAttributes - I can't get it to work
NavTitle.title = "Using an outlet helps"
NavBar.titleTextAttributes?.updateValue(UIColor.blueColor(), forKey: NSForegroundColorAttributeName)

我承担了整个 NavBar 项目,因为我在某处读到,通常使用 NavBar 来显示项目和标题,而不将它们用于导航智能或属性。

但现在在花了几天时间弄清楚它们是如何工作之后,我打算为此放弃它们。使用水平 StackView 或工具栏更容易。希望有一天有人能从这么长的 posting 中受益...

另一项更新:

我开始怀疑是否可以使用以 "self.view.xxx." 开头的语法从视图控制器中引用导航栏这是在调试断点处截取的控制器视图层次结构的屏幕截图在 viewDidLoad 中。我可以在控制器页面上看到所有 UIView,导航栏除外。

所以引用导航栏的唯一方法可能是 (1) UINavigationBar.xxx 使用某种全局 class 引用,或者 (2) 使用 IBOutlet,通过故事板创建, 直接引用导航栏。

我认为您希望导航栏具有颜色才能做到这一点,您需要选择左下角的导航栏,并在右上角更改栏色调,从而更改导航栏的颜色。参考图片。 http://i.stack.imgur.com/oRBpo.png

答案嵌入在上面那个长长的post中。为了清楚和简单起见,我将在此处进行总结。

要以编程方式更改 NavBar 颜色,您可以通过两种方式引用 NavBar:通过在视图控制器代码中使用显式 outlet 来引用导航栏、导航标题或导航项。或者您可以使用 UINavigationBar.xxx 引用全局导航栏。

但是由于 NavBar 不是 self.view 下面 object 层级的一部分,我无法创建有效的 self.view.xxx 引用。

我仍然不知道如何引用 NavTitle 的文本字体、颜色和大小。如果您选择深色导航栏颜色并希望在深色背景上使用白色文本(色调),这就是一个问题。

这是 Xcode 7.3 的答案。为导航栏设置标题文本颜色:-

将其放入 AppDelegate didFinishLaunchingWithOptions

    if let _ = UINavigationBar.appearance().titleTextAttributes {
        print("setting textAttributes")
        UINavigationBar.appearance().titleTextAttributes?.updateValue(UIColor.whiteColor(), forKey: "TextColor")
    }
    else {
        print("textAttributes is nil")
        UINavigationBar.appearance().titleTextAttributes = ["TextColor" : UIColor.whiteColor()]
    }