多种颜色的大导航栏文本

时间:2017-11-13 00:46:30

标签: ios uinavigationbar nsattributedstring uinavigationitem

iOS 11在导航栏中引入了较大文本选项。我想要一个使用多种颜色的标题。例如:

enter image description here

设置标题相当容易,甚至可以更改整个标题的颜色:

[[self navigationItem] setTitle: @"Colors"];
[[[self navigationController] navigationBar] setLargeTitleTextAttributes: @{NSForegroundColorAttributeName: [UIColor colorFromHex: redColor]}];

我无法弄清楚如何改变标题的一部分。例如,选择这样的范围的方法 - NSRangeMake(0, 1) - 以便我可以为其应用颜色。

这一定是可能的,对吧?

2 个答案:

答案 0 :(得分:3)

没有公共API可以为大型标题设置您自己的属性文本。

解决方案是向下导航视图层次结构。你特别提到过你想要避免这种情况,但这是修改颜色的唯一方法,同时免费获得剩余的func characterBeforeCursor() -> String? { // get the cursor position if let cursorRange = postTextField.selectedTextRange { // get the position one character before the cursor start position if let newPosition = postTextField.position(from: cursorRange.start, offset: -1) { let range = postTextField.textRange(from: newPosition, to: cursorRange.start) return postTextField.text(in: range!) } } return nil } 行为。

当然,您始终可以创建自己的UINavigationBar并设置其UILabel,但您必须自己重新创建任何导航栏动画和其他行为。

老实说,最简单的解决方案是修改您的设计,使其不需要多色大标题,因为目前不支持。

我沿着“探索”路径潜入水中,并且有各种各样的视觉问题,动画捕捉回原始文字颜色。

以下是我使用的代码,如果它对任何试图获得类似效果的人都有用:

attributedText

“探索”方法的缺点是它不是受支持的API,这意味着它可能很容易在未来的更新中中断,或者在各种边缘情况下无法正常工作。

答案 1 :(得分:2)

不幸的是,这并非易事,它没有得到官方的支持。以下是我考虑的几种方法:

•覆盖导航栏子类中的layoutSubiews()。遍历视图层次结构,并使用UILabel来应用属性。我不推荐这个,我已经放弃了做类似的事情 - iOS 11导航栏有一个看似复杂和不可预测的行为。像交互式手势这样的东西并不总能与你所擅长的任何东西都很好。你的情况比我的情况稍微简单一些,所以这可能会很好。

•从头开始创建自己的导航栏样式视图 - 不从UINavigationBar继承的视图。这是我在做类似事情时最终采取的路线。这是更多的工作,并不会反映Apple对视觉风格的未来变化 - 但另一方面,即使在较旧的iOS版本中,您的应用程序也会看起来相同,并且您可以完全控制。

•隐藏导航栏分隔符,将其恢复为非大尺寸,并在其下方放置自己的视图,模仿外观(背景是带有.extraLight模糊样式的视觉效果视图) - 您可以放置​​自定义此视图中的标签。