【问题标题】:Can we set NSFont's font-weight or font-style directly, instead of changing the font name?我们可以直接设置 NSFont 的 font-weight 或 font-style,而不是更改字体名称吗?
【发布时间】:2012-11-05 17:44:35
【问题描述】:

前面的问题:

我们可以直接访问属性字符串的字体粗细和字体样式信息吗?或者我们可以创建一个可以设置此信息的新字符串吗?

解释:

在 iOS 6 中,您可以将选择切换为粗体或斜体。但它的工作方式令人烦恼:它不会更改 Apple 向我们公开的 NSFontAttributeName(例如,将字体名称从“HelveticaNeue”更改为“HelveticaNeue-Bold”)。相反,它将字体系列保留为“Helvetica Neue”,并将样式字符串中的“font-weight”更改为粗体。如果您要向属性文本的实例询问其描述,您会看到类似这样的字体信息:

NSFont = "<UICFFont: 0x1fbc53a0> font-family: \"Helvetica Neue\"; font-weight: bold; font-style: normal; font-size: 16px";

这会产生问题。我们不能在保留粗体和斜体样式信息的同时更改字体。如果您跳过扫描旧属性字符串以获取样式信息,创建具有新字体的新字符串,然后更改字体属性名称(例如,在您想要的任何地方使用“Courier-Bold”)粗体),您会产生一个新问题:如果您尝试将字体切换回正常(不是粗体),您将拥有一个像“Courier-Bold”这样的字体名称​​AND字体粗细为“粗体”,因为样式信息尚未设置为粗体。当然,切换不会更改字体名称。因此,您实际上创建了一种字体,当用户切换所选文本时,该字体将无法再更改。用户将按下上下文菜单中的“粗体”按钮,但它不会执行任何操作,因为粗体现在已被硬编码到字体名称中,您可能会说。

如果您走另一条路并尝试在 UITextView 中覆盖“toggleBoldface”和“toggleItalic”,实际上似乎无法阻止样式字符串中的样式信息被更改。在切换事件期间,您似乎无法单独更改字体名称。

那么,问题又来了:我们能否以某种方式直接访问字体粗细和字体样式信息?或者我们可以创建一个可以设置此信息的新字符串吗?这将解决尝试从一种字体切换到另一种字体并保留样式信息的问题。

双重澄清:

我们谈论的是 iOS。当您为某些字符范围设置属性字符串的字体属性 (NSFontAttributeName) 时,iOS 内部会创建一个带有样式字符串的 NSFont。如果您自己设置了字体属性,样式字符串将显示为“font-weight: normal; font-style: normal”。但是这个样式字符串是存储在 UITextView(通过切换)中设置的粗体和斜体信息的位置。

【问题讨论】:

  • 您需要在问题中至少再编辑一次:NSFont 用于 MacOS,而 UIFont 用于 iOS;您使用的是哪种架构和/或您使用的是哪种字体类?
  • 恐怕这不正确。您创建一个 NSFontAttributeName 作为属性字符串的属性(通过指定 UIFont),iOS 内部将其转换为 NSFont。因此,如果您使用 NSLog 询问一段属性文本的描述,我所包含的代码就是“NSFont”。
  • 更具体地说,如果您向 NSAttributedString 询问其描述,则 NSFont 信息是您将阅读的内容的一部分。

标签: ios fonts styling


【解决方案1】:

看起来您可以使用 CTFontAttributesRef 创建一个新的 CTFontRef,其中您已为属性键 kCTFontWeightTrait 和/或 kCTFontSymbolicTrait 设置了值。这有帮助吗?

参见。 CTFontDescriptorReferenceCTFontReference

编辑

我猜这行不通——我自己研究了更多...把这个留在这里以防其他人有同样的想法。

【讨论】:

  • 一旦创建,它怎么能被应用到一个 NSAttributedString 上呢?例如,当我创建属性字典时,在设置 NSFontAttributeName 时可以使用它来代替 UIFont 吗?
  • 哦,我相信这回答了我的问题:将 CTFont 转换为 UIFont。 stackoverflow.com/questions/6714858/…如果有问题我会报告,或者如果它有效我会接受答案。但我认为你已经让我走上了正轨。谢谢。
  • 最终我认为这不会成功。据我了解(经过一些尝试),您不能在 UITextView 中使用 CoreText 字体。我错了吗?
  • 对不起。这不好。这个问题与这个关于 UICFFont 和 CTFont 的 Apple 开发问题相同:devforums.apple.com/message/751433
  • 感谢您的帮助。最好的希望似乎是避免使用 SDK 切换粗体和斜体,而是自己创建类似的操作(通过您自己的界面),其中字体名称设置为粗体或斜体名称,样式字符串为不受影响。
猜你喜欢
  • 2022-12-21
  • 1970-01-01
  • 2012-04-20
  • 2016-12-23
  • 2016-05-30
  • 2016-10-16
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多