首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIFontWeightTrait和UIFontDescriptorFamilyAttribute在从UIFontDescriptor创建UIFont时忽略了

UIFontWeightTrait和UIFontDescriptorFamilyAttribute在从UIFontDescriptor创建UIFont时忽略了
EN

Stack Overflow用户
提问于 2014-07-23 12:33:59
回答 5查看 6K关注 0票数 21

给定以下代码和运行iOS 7.1或更高版本的设备:

代码语言:javascript
复制
 NSDictionary *fontTraitsDictionary = @{UIFontWeightTrait : @(-1.0)};
 NSDictionary *attributesDictionary = @{
                                       UIFontDescriptorFamilyAttribute : @"Helvetica Neue", 
                                       UIFontDescriptorTraitsAttribute : fontTraitsDictionary
                                       };
 UIFontDescriptor *ultraLightDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:attributesDictionary];
 UIFont *shouldBeAnUltraLightFont = [UIFont fontWithDescriptor:ultraLightDescriptor size:24];

 NSLog(@"%@", shouldBeAnUltraLightFont);

我希望shouldBeAnUltraLightFont的值是HelveticaNeue-UltraLight的一个实例,但实际上它是:

代码语言:javascript
复制
<UICTFont: 0x908d160> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 24.00pt

据我所知,我正在跟踪苹果的文档。为什么字体族和字体权重信息被完全忽略了?

Things我试过

  • 我试过其他姓氏,比如Helvetica,Avenir等等。
  • 我在valid range from -1 to 1中尝试了其他字体权重,增量为0.25

不管这些更改,返回的字体总是一个普通重量的Helvetica的普通实例。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-26 21:58:49

我遇到了同样的问题,而这些文档并没有多大帮助。最后,我发现使用家族属性与face属性相结合是有效的:

代码语言:javascript
复制
 UIFontDescriptor* desc = [UIFontDescriptor fontDescriptorWithFontAttributes:
        @{
            UIFontDescriptorFamilyAttribute: @"Helvetica Neue",
            UIFontDescriptorFaceAttribute: @"Light"
        }
    ];
票数 12
EN

Stack Overflow用户

发布于 2014-08-12 06:14:18

From the docs:

字体特征字典键 下列常量可用作键,从特征字典中检索有关字体描述符的信息。 NSString *const UIFontSymbolicTrait;NSString *const UIFontWeightTrait;NSString *const UIFontWidthTrait;NSString *const UIFontSlantTrait;

在我看来,这些键只是为了从字体描述符中获取信息而设计的,而不是为了设置它。例如,您可以这样做:

代码语言:javascript
复制
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
NSDictionary *traits = [font.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute];
CGFloat weight = [traits[UIFontWeightTrait] floatValue];

这将告诉你,你得到的字体比正常的重量要重一点。这看起来并不像要求字体重量更轻而不必给出确切的名称那样有用--但这似乎是预期的用法。

票数 7
EN

Stack Overflow用户

发布于 2014-12-01 16:11:32

在寻找粗体或斜体字时,象征性的特征至少会得到尊重。所以这件事很好用:

代码语言:javascript
复制
+ (UIFont*)fontWithFamily:(NSString*)family bold:(BOOL)bold italic:(BOOL)italic size:(CGFloat)pointSize {
  UIFontDescriptorSymbolicTraits traits = 0;
  if (bold)   traits |= UIFontDescriptorTraitBold;
  if (italic) traits |= UIFontDescriptorTraitItalic;
  UIFontDescriptor* fd = [UIFontDescriptor
                          fontDescriptorWithFontAttributes:@{UIFontDescriptorFamilyAttribute: family,
                                                             UIFontDescriptorTraitsAttribute: @{UIFontSymbolicTrait:
                                                                                                  [NSNumber numberWithInteger:traits]}}];
  NSArray* matches = [fd matchingFontDescriptorsWithMandatoryKeys:
                      [NSSet setWithObjects:UIFontDescriptorFamilyAttribute, UIFontDescriptorTraitsAttribute, nil]];
  if (matches.count == 0) return nil;
  return [UIFont fontWithDescriptor:matches[0] size:pointSize];
}

例如[MyClass fontWithFamily:@"Avenir Next Condensed" bold:YES italic:NO size:12.0f];

我不认为这对OP有帮助,因为OP专门使用UIFontWeightTrait寻找一种轻巧的字体,但它可能会帮助其他有类似问题的人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24910599

复制
相关文章

相似问题

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