ary*_*axt 1 objective-c ctfont ctfontref
我有一个包含字体样式和sumbolic特征的CTFont.
我想创建一个新样式的新字体,它继承了第一个字体的符号特征.我怎样才能做到这一点?
CTFontRef newFontWithoutTraits = CTFontCreateWithName((CFString)newFontName, CTFontGetSize(font), NULL);
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, CTFontGetSize(font), NULL, 0, CTFontGetSymbolicTraits(font));
Run Code Online (Sandbox Code Playgroud)
新字体在这里为null我不知道应该传递给4th参数CTFontCreateCopyWithSymbolicTraits.
我这行代码生成非粗体字体的粗体字:
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(currentFont, 0.0, NULL, (wantBold?kCTFontBoldTrait:0), kCTFontBoldTrait);
Run Code Online (Sandbox Code Playgroud)
currentFont是CTFontRef我想要添加符号特征wantBold 是一个布尔值,告诉我是否要添加或删除字体的粗体特征kCTFontBoldTrait 是我想在字体上修改的符号特征.第4个参数是您要应用的值.第五个是选择符号特征的掩码.
您可以将其作为位掩码应用于符号特征,其中第4个参数CTFontCreateCopyWithSymbolicTraits是值,第5个参数是掩码:
newTrait = oldTrait | (value&mask),设置对应于mask值的位value.如果要取消设置 symtrait并将其从字体中删除,则使用值0作为第4个参数,iOS可能会应用sthg,例如newTrait = oldTrait & ~mask取消设置该位.
但是如果你需要,你也可以同时设置和取消设置多个位(因此是多个符号特征),使用右边value有1个位来设置,0个位用于取消设置(或忽略),并使用右边的mask有1个需要修改的位和0个不需要更改的位.
[EDIT2]
我终于找到了针对你的特定情况的解决方案:你需要获得font你已经做过的symtraits掩码...并且按位 - 或者你的newFontWithoutTraits字体的symtraits .
这是因为newFontWithoutTraits实际上确实有默认的symtraits(与我的想法相反,它具有非零CTFontSymbolicTraits值),因为symtraits值还包含字体类和这类事物的信息(所以即使是非粗体,非斜体字体也可以具有非零symtraits值,记录字体的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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4644 次 |
| 最近记录: |