1

我有一个包含字体样式和 sumbolic 特征的 CTFont。

我想创建一种具有新样式的新字体,该样式继承了第一种字体的符号特征。我怎样才能做到这一点?

CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFString)newFontName, CTFontGetSize(font), NULL);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, CTFontGetSize(font), NULL, 0, CTFontGetSymbolicTraits(font));

新字体在这里为空我不知道我应该将什么传递4thCTFontCreateCopyWithSymbolicTraits.

4

1 回答 1

9

我执行这行代码以从非粗体字体生成粗体字体:

CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(currentFont, 0.0, NULL, (wantBold?kCTFontBoldTrait:0), kCTFontBoldTrait);
  • currentFontCTFontRef我想添加符号特征
  • wantBold是一个布尔值,告诉我是否要向字体添加或删除粗体特征
  • kCTFontBoldTrait是我要在字体上修改的符号特征。

第 4 个参数是您要应用的值。第 5 个是选择符号特征的掩码。


您可以将其作为位掩码应用于符号特征,其中的第 4 个参数CTFontCreateCopyWithSymbolicTraits是值,第 5 个参数是掩码:

  • 如果要设置symtrait 并将其添加到字体中,iOS 可能会应用 sthg like newTrait = oldTrait | (value&mask),将对应的位设置mask为 的值value
  • 如果要取消设置symtrait 并将其从字体中删除,则使用值 0 作为第 4 个参数,iOS 可能会应用 sthg likenewTrait = oldTrait & ~mask取消设置位。

  • 但是,如果需要,您也可以一次设置和取消设置多个位(因此具有多个符号特征),使用正确value的位设置 1 位和位上的 0 取消设置(或忽略),并使用正确的mask需要修改的位为 1,不需要更改的位为 0。


[编辑2]

我终于设法为您的具体情况找到了解决方案:您需要像已经做的那样获得您的符号掩码font……并按位或使用newFontWithoutTraits字体的符号。

这是因为newFontWithoutTraits实际上确实具有默认的 symtraits(与我的想法相反,它具有非零CTFontSymbolicTraits值),因为 symtraits 值还包含字体类和此类内容的信息(因此即使是非粗体、非斜体字体也可以有一个非零符号值,记录字体符号的十六进制值以便更好地理解)。

所以这是你需要的代码

CTFontRef font = CTFontCreateWithName((CFStringRef)@"Courier Bold", 12, NULL);
CGFloat fontSize = CTFontGetSize(font);
CTFontSymbolicTraits fontTraits = CTFontGetSymbolicTraits(font);
CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFStringRef)@"Arial", fontSize, NULL);
fontTraits |= CTFontGetSymbolicTraits(newFontWithoutTraits);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, fontSize, NULL, fontTraits, fontTraits);

// Check the results (yes, this NSLog create leaks as I don't release the CFStrings, but this is just for debugging)
NSLog(@"font:%@, newFontWithoutTraits:%@, newFont:%@", CTFontCopyFullName(font), CTFontCopyFullName(newFontWithoutTraits), CTFontCopyFullName(newFont));

// Clear memory (CoreFoundation "Create Rule", objects needs to be CFRelease'd)
CFRelease(newFont);
CFRelease(newFontWithoutTraits);
CFRelease(font);
于 2011-09-20T22:01:23.733 回答