首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C - CTFont是否更改字体样式?

Objective-C - CTFont是否更改字体样式?
EN

Stack Overflow用户
提问于 2011-09-21 05:52:12
回答 1查看 4.9K关注 0票数 1

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

我想创建一个新的字体,它继承了第一个字体的符号特征。我如何才能做到这一点?

代码语言:javascript
复制
CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFString)newFontName, CTFontGetSize(font), NULL);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, CTFontGetSize(font), NULL, 0, CTFontGetSymbolicTraits(font));

这里的新字体是空的,我不知道应该向CTFontCreateCopyWithSymbolicTraits中的4th参数传递什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-21 06:01:24

我这样做是为了从非粗体字体生成粗体字体:

代码语言:javascript
复制
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(currentFont, 0.0, NULL, (wantBold?kCTFontBoldTrait:0), kCTFontBoldTrait);

  • currentFont是我想要添加的符号特征to
  • wantBold是一个布尔值,用来告诉我是要在字体中添加还是删除粗体特征font
  • kCTFontBoldTrait是我要在CTFontRef上修改的符号特征。

第四个参数是要应用的值。第五个是选择符号特征的掩码。

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

  • 如果你想设置符号特征并将其添加到字体中,iOS可能会像newTrait = oldTrait | (value&mask)一样应用sthg,将与mask对应的位设置为你想取消设置符号特征并将其从字体中移除的value.
  • If的值,你使用值0作为第四个参数,而iOS可能会应用像newTrait = oldTrait & ~mask这样的sthg来取消设置该位。
  • 但如果需要,也可以一次设置和取消设置多个位(即多个符号特征)。使用右侧value,其中1表示要设置的位,0表示要取消设置(或忽略)的位,并使用右侧mask,其中1表示需要修改的位,0表示不需要更改的位。

EDIT2

我终于找到了针对你的特殊情况的解决方案:你需要像你已经做的那样获得font的符号掩码…和位-或者它与您的newFontWithoutTraits字体的符号。

这是因为newFontWithoutTraits实际上do有默认的symtrait(与我想的相反,它有一个非零的CTFontSymbolicTraits值),因为symtrait值也包含字体类的信息和诸如此类的东西(所以即使是一个非粗体、非斜体的字体也可以有一个非零的symtrait值,记录你的字体的符号的十六进制值,以便更好地理解)。

这就是你需要的代码,

代码语言:javascript
复制
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);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7492237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档