iOS 11在导航栏中引入了较大文本选项。我想要一个使用多种颜色的标题。例如:
设置标题相当容易,甚至可以更改整个标题的颜色:
[[self navigationItem] setTitle: @"Colors"];
[[[self navigationController] navigationBar] setLargeTitleTextAttributes: @{NSForegroundColorAttributeName: [UIColor colorFromHex: redColor]}];
我无法弄清楚如何改变标题的一部分。例如,选择这样的范围的方法 - NSRangeMake(0, 1)
- 以便我可以为其应用颜色。
这一定是可能的,对吧?
答案 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模糊样式的视觉效果视图) - 您可以放置自定义此视图中的标签。