iOS 11 中 UINavigationBar 大标题的默认字体?

Default Font for UINavigationBar Large Title in iOS 11?

我知道如何在 iOS11 中设置大标题的颜色和更改字体,但我很难找到大标题的默认字体和字体大小。我想在应用程序的其他地方复制字体。我尝试了以下方法,但它们没有给出字体或字体大小的结果。不确定我还应该在哪里寻找这个。

NSLog(@"self.navigationController.navigationBar.largeTitleTextAttributes:%@",self.navigationController.navigationBar.largeTitleTextAttributes);

NSDictionary *dict = self.navigationController.navigationBar.largeTitleTextAttributes;
UIFont *font = [dict objectForKey:@"NSFontAttributeName"];
NSLog(@"font is.. %@, %@, %@",font,font.fontName,font.fontDescriptor);

编辑: 我打开了用户界面检查器,它显示:

这里不用写代码:)

我实际上是通过尝试不同的字体和大小找到了答案。现在,免责声明,这可能会随着 accessibility/dynamic 字体大小而改变。但是我找到的字体和大小是

[UIFont systemFontOfSize:32 weight:UIFontWeightBold]

我仍然想找到一种方法来以编程方式获得此信息,并将等待接受答案,希望有人知道如何做到这一点。同时,希望这对某人有帮助。

获得大标题字体的正确解决方案如下:

Objective-C:

UIFont *font = [UIFont preferredFontForTextStyle: UIFontTextStyleLargeTitle];
NSLog("%@", font);

Swift:

let font = UIFont.preferredFont(forTextStyle: .largeTitle)
print(font)

即使用户在“设置”应用中应用了各种辅助功能和字体大小更改,这也会给出正确的值。

以上默认情况下会打印出以下内容(在 playground 中):

<UICTFont: 0x7fa865c05390> font-family: ".SFUIDisplay"; font-weight: normal; font-style: normal; font-size: 34.00pt

请注意,在上面的代码中使用 .largeTitle 必须仅使用 iOS 11 调用。如果您的应用支持 iOS 10 或更早版本,则必须将该代码包装在正确使用 @available.

iOS12 大标题 System Bold 34(旧金山)

[UIFont boldSystemFontOfSize:34]

iOS9 - iOS12 系统 Semibold 17(旧金山)

[UIFont systemFontOfSize:17 weight:UIFontWeightSemibold]

iOS8 系统半粗体 17 (Helvetica Neue)

[UIFont systemFontOfSize:17 weight:UIFontWeightSemibold]

iOS7 系统粗体 17 (Helvetica Neue)

[UIFont boldSystemFontOfSize:17];

尝试这样的事情:

if #available(iOS 11.0, *) { navigationBar.largeTitleTextAttributes = [.foregroundColor: UIColor.white, .font: UIFont(name: "HelveticaNeue-Bold", size: 20)!] }

在 iOS 13 上,这是用于导航栏中大标题的确切字体。我逐个像素比较屏幕截图,它完全匹配!

UIFont.systemFont(ofSize: 34, weight: .bold)

最简单的方法是使用

UIFont.preferredFont(forTextStyle: .largeTitle)

请记住,不是 UINavigationBar 的大标题,它是您自己视图中使用的一种样式,这就是重量减轻的原因。但是您可以对其施加预期的重量。

UIFont(descriptor: normalTitleFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalTitleFont.pointSize)

完整代码:

let normalTitleFont = UIFont.preferredFont(forTextStyle: .largeTitle)
let largeTitleFont = UIFont(descriptor: normalTitleFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalTitleFont.pointSize)

与硬编码大小或字体相比,这种方法更好。

用户可以更改设备上的辅助功能设置,硬编码值将被关闭。

.largeTitle 文本样式的值也会发生变化,您的标题将获得正确的样式。