首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解开UIFontDescriptor

解开UIFontDescriptor
EN

Stack Overflow用户
提问于 2013-11-06 21:09:33
回答 1查看 7.4K关注 0票数 8

我在应用程序中使用动态类型,并且在某些情况下,我希望更改字体的外观,例如,使其斜体或取消粗体。添加样式非常容易:

代码语言:javascript
复制
UIFontDescriptor *descriptor = [[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline]
                                fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
UIFont *font = [UIFont fontWithDescriptor:descriptor size:descriptor.pointSize];

但是,没有明确的机制来移除样式。我可以尝试调整属性,但是使用完全没有文档的API,它们看起来更加令人生畏:

常规标题:{ NSCTFontUIUsageAttribute = UICTFontTextStyleHeadline;NSFontNameAttribute = ".AppleSystemUIHeadline";NSFontSizeAttribute = 17;}意大利标题:{ NSCTFontUIUsageAttribute = UICTFontTextStyleItalicHeadline;NSFontNameAttribute = ".AppleSystemUIItalicHeadline";NSFontSizeAttribute = 17;}

我错过了另一条路吗?我可以使用[UIFont systemFontWithSize:descriptor.pointSize],但是我不想丢失任何由动态类型提供的绘图规则。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-08 22:00:44

fontDescriptorWithSymbolicTraits:方法实际上能够做您想做的事情,除了在内置语义文本样式中支持字体特征的一些边缘情况之外。这里的关键概念是,该方法将前面描述符上的所有符号特征替换为新的特征。文献资料在这个问题上有点犹豫,只是简单地说,新的特征“优先于”旧的。

按位操作用于添加和删除特定的特征,但在使用由preferredFontDescriptorWithTextStyle:生成的描述符时,似乎需要特别小心。不是所有的字体都支持所有的特征。例如,标题字体根据用户喜欢的内容大小进行加权,即使可以去掉描述符的粗体特征,匹配的UIFont也将是粗体。不幸的是,这在任何地方都没有被记录下来,所以发现任何额外的细微差别都是留给读者的练习。

以下示例说明了这些问题:

代码语言:javascript
复制
// Start with a system font, in this case the headline font
// bold: YES italic: NO
UIFontDescriptor * originalDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline];
NSLog(@"originalDescriptor bold: %d italic: %d",
      isBold(originalDescriptor), isItalic(originalDescriptor));

// Try to set the italic trait. This may not be what you expected; the 
// italic trait is not added. On a normal UIFontDescriptor the italic
// trait would have been set and the bold trait unset.
// Ultimately it seems that there is no variant of the headline font that
// is italic but not bold.
// bold: YES italic: NO
UIFontDescriptor * italicDescriptor = [originalDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
NSLog(@"italicDescriptor bold: %d italic: %d",
      isBold(italicDescriptor), isItalic(italicDescriptor));

// The correct way to make this font descriptor italic (and coincidentally
// the safe way to make any other descriptor italic without discarding its
// other traits) would be as follows:
// bold: YES italic: YES
UIFontDescriptor * boldItalicDescriptor = [originalDescriptor fontDescriptorWithSymbolicTraits:(originalDescriptor.symbolicTraits | UIFontDescriptorTraitItalic)];
NSLog(@"boldItalicDescriptor bold: %d italic: %d",
      isBold(boldItalicDescriptor), isItalic(boldItalicDescriptor));

// Your intention was to remove bold without affecting any other traits, which
// is also easy to do with bitwise logic.
// Using the originalDescriptor, remove bold by negating it then applying
// a logical AND to filter it out of the existing traits.
// bold: NO  italic: NO
UIFontDescriptor * nonBoldDescriptor = [originalDescriptor fontDescriptorWithSymbolicTraits:(originalDescriptor.symbolicTraits & ~UIFontDescriptorTraitBold)];
NSLog(@"nonBoldDescriptor bold: %d italic: %d",
      isBold(nonBoldDescriptor), isItalic(nonBoldDescriptor));

// Seems like it worked, EXCEPT there is no font that matches. Turns out
// there is no regular weight alternative for the headline style font.
// To confirm, test with UIFontDescriptorTraitsAttribute as the mandatory
// key and you'll get back a nil descriptor.
// bold: YES italic: NO
nonBoldDescriptor = [nonBoldDescriptor matchingFontDescriptorsWithMandatoryKeys:nil].firstObject;
NSLog(@"nonBoldDescriptor bold: %d italic: %d",
      isBold(nonBoldDescriptor), isItalic(nonBoldDescriptor));

为了简洁起见,上面使用的isBoldisItalic函数可以实现如下:

代码语言:javascript
复制
 BOOL isBold(UIFontDescriptor * fontDescriptor)
 {
    return (fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) != 0;
 }

 BOOL isItalic(UIFontDescriptor * fontDescriptor)
 {
    return (fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) != 0;
 }
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19822862

复制
相关文章

相似问题

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