首页 文章

我们可以直接设置NSFont的font-weight或font-style,而不是更改字体名称吗?

提问于
浏览
6

The question up front:

我们可以直接访问属性字符串的font-weight和font-style信息吗?或者我们可以创建一个新的字符串,我们可以设置这些信息吗?

The explanation:

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

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

这会产生问题 . 我们无法在保留粗体和斜体样式信息的同时更改字体 . 如果您跳过扫描旧属性字符串以获取样式信息的箍,创建带有新字体的新字符串,然后更改字体属性名称(例如,使用"Courier-Bold",对于您希望它为粗体的所有位置),创建一个新问题:如果您尝试将字体切换回正常(非粗体),您将改为使用字体名称"Courier-Bold"和字体权重"bold",因为样式信息尚未设置为粗体 . 当然,切换不会改变字体名称 . 因此,您实际上创建了一种在用户切换所选文本时无法再更改的字体 . 用户将按下上下文菜单中的"bold"按钮,但它不会执行任何操作,因为粗体现在已经硬编码到字体名称中,您可能会说 .

如果您转到其他路径并尝试在UITextView中覆盖“toggleBoldface”和“toggleItalic”,则实际上似乎无法防止样式字符串中的样式信息被更改 . 在切换事件期间,您似乎无法单独更改字体名称 .

所以,问题是:我们可以直接以某种方式访问font-weight和font-style信息吗?或者我们可以创建一个新的字符串,我们可以设置这些信息吗?这将解决尝试从一种字体切换到另一种字体并保留样式信息的问题 .

And a double clarification:

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

1 回答

  • 1

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

    比照CTFontDescriptorReferenceCTFontReference

    EDIT

    猜猜这不起作用 - 我更多地调查了一下......把这个留在这里以防其他人有同样的想法 .

相关问题