【问题标题】:Objective-C - CTFont change font style?Objective-C - CTFont 更改字体样式?
【发布时间】:2013-06-28 02:52:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c ctfont ctfontref


    【解决方案1】:

    我用这行代码从非粗体生成粗体:

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

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


    你可以把它当作位掩码应用于符号特征,其中CTFontCreateCopyWithSymbolicTraits 的第 4 个参数是值,第 5 个参数是掩码:

    • 如果你想设置 symtrait 并将其添加到字体中,iOS 可能会应用newTrait = oldTrait | (value&mask) 之类的东西,将mask 对应的位设置为value 的值。
    • 1234563位。
    • 但是,如果您需要,您也可以一次设置和取消设置多个位(因此多个符号特征),使用正确的 value,其中要设置的位为 1,要取消设置的位为 0(或忽略),并使用正确的mask,需要修改的位为 1,不需要更改的位为 0。


    [EDIT2]

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

    这是因为 newFontWithoutTraits 实际上 do 具有默认的 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);
    

    【讨论】:

    • 这对我不起作用。我不知道我是否想要粗斜体或等>?它应该从旧字体复制过来。我需要一种从以前的字体中获取此信息的方法
    • 阅读我的附加信息(我刚刚编辑了我的答案):我详细解释了它是如何工作的。您不需要需要检索字体的先前符号特征,CTFontCreateCopyWithSymbolicTraits 已经复制了您作为第一个参数传递的字体及其符号特征,然后将只修改一个被第 5 个参数(位掩码)掩蔽的。
    • 正如我在编辑的最后一点中所解释的那样,如果您需要从另一种字体复制符号特征,您可以使用与创建副本不同的字体,只需传递你想要从第4个参数中复制特征的字体的symtraits,并使用all-1的掩码作为第5个参数告诉iOS应用 all symtraits 的值:CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(newFontWithoutTraits, CTFontGetSize(font), NULL, CTFontGetSymbolicTraits(font), ~0); (~0 是 0=0x000000 的按位否定,因此它等同于全 1 的值0xFFFFFFFF)
    • 它返回 null 作为 newFont。我检查了字体,newFontWithoutTraits 都存在
    • OK 我找到了解决方案(经过测试和批准:我创建了普通的“Arial”字体(newFontWithoutSymtraits)并应用了之前创建的font“Courier Bold”的符号(即我应用了“粗体” symtrait)并以“Arial Bold”结尾 :) 查看我(再次)编辑的答案!
    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2011-12-02
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多