【发布时间】:2016-07-19 00:08:06
【问题描述】:
我正在尝试学习如何在我的一个视图控制器(UIViewController,手动添加导航栏,我的故事板上没有导航控制器)中访问和更改主题颜色和字体。
我在视图控制器 viewDidLoad 中使用此代码已部分成功:
UINavigationBar.appearance().backgroundColor = theme.TabsColor
UINavigationBar.appearance().barTintColor = theme.NavColor
但是来自 SO 上另一篇文章的这段代码可以编译/工作,但没有效果:
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 项目并为其着色,我在情节提要上给了它们一个 restoreIdentifer,然后我可以在我的搜索循环中找到它们。但是导航栏没有restoreIdentifiers,所以这个方法行不通。
如何从控制器中访问和关闭导航栏中的 .translucent?
如何访问和修改添加到视图控制器的导航栏上事物的颜色和文本属性? (我使用的是没有导航控制器的导航栏。)
如何访问和修改整个应用中所有导航栏(带有导航控制器)的颜色和文本?
谢谢。我希望对于一篇文章来说这不是太多问题,但所有问题都在同一件事上——如何在 swift 2.2 中访问导航栏(有和没有控制器)..(2011 年有很多帖子- 2014 年在 ObjC 导航栏上,但它们对我帮助不大。
更新:我对导航栏的理解有了更大的进步。
最明显的飞跃(这让我觉得自己像个真正的新手,我是 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
所以我可以使用 outlet 来引用 NavBar 和 NavTitle(也可能是 NavBarItems),并且可以使用 barTintColor(但不是 backgroundColor)更改 NavBar 的背景。我可以使用 NavBar.tintColor 更改 NavItem backItem 的颜色。
但我仍然不知道如何更改 NavTitle 文本的颜色、字体等,无论是使用 NavBar...whatever 或 NavTitle...whatever 之类的引用。我认为答案就在 titleTextAttributes 字典中,但我在网上或 Apple (swift) 文档中找不到代码示例。我尝试了下面的代码(摘自此处在 SO 上发布的 ObjC),但它似乎没用(无效)。所以我仍然坚持如何更改标题文本的前景、背景颜色或字体等。
// 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 或 Toolbar 更容易。希望有一天有人能从这篇冗长的帖子中受益......
另一个更新:
我开始怀疑是否可以使用以“self.view.xxx”开头的语法从视图控制器中引用导航栏。这是控制器视图层次结构的屏幕截图,在 viewDidLoad 中的调试断点处截取。我可以看到控制器页面上的所有 UIView,除了导航栏。
因此,引用导航栏的唯一方法可能是 (1) 使用 UINavigationBar.xxx 使用某种全局类引用,或者 (2) 使用使用情节提要创建的 IBOutlet 直接引用导航栏。
【问题讨论】:
-
您是否在 UINavigationBar 中添加而不在 UINavigationController 中嵌入 UIViewController?
-
是的,这就是我第一次尝试的方法,在某处人们经常这样做。但事实证明,除了通过全局类引用或直接出口引用之外,要获得对 bar 的引用和对 barTintColor 字段的引用路径是非常困难的。我也不明白半透明度如何影响背景颜色。似乎背景只有在 translucent=true 时才有用,因为如果 translucent 为 false,则背景颜色根本不会显示出来。然后需要 TintColor。
-
我个人没有使用嵌入在 navigationControllers 中的 viewControllers 之外的 navigationBars 的经验。我建议采用这种方法,因为这样从视图控制器内部访问导航栏会更容易
标签: ios swift uinavigationbar xcode7