使用中世纪(小写,非衬里)数字

时间:2014-02-27 13:17:00

标签: objective-c cocoa-touch ios7 nsattributedstring typography

我收到客户要求在iOS 7项目中使用某种字体的请求,因为它有medieval numbers

有没有办法为NSAttributedString激活这些数字?由于使用了默认的衬里编号,因此也包含在字体中。


这是一个例子。两条线都有相同的字体,没有变体(常规),一旦激活了中世纪数字,第二条就是默认的衬里数字。

enter image description here

2 个答案:

答案 0 :(得分:11)

这些称为小写数字,可以使用UIFontDescriptor打开。

首先,您需要为某些常量导入CoreText:

#import <CoreText/SFNTLayoutTypes.h>
or
@import CoreText.SFNTLayoutTypes;

然后使用字体描述符创建字体。在这里,我使用 Georgia 系列:

NSDictionary *lowercaseNumbers = @{
                                   UIFontFeatureTypeIdentifierKey: @(kNumberCaseType),
                                   UIFontFeatureSelectorIdentifierKey: @(kLowerCaseNumbersSelector),
                                   };
UIFontDescriptor *descriptor = [[UIFontDescriptor alloc] initWithFontAttributes:
                                @{
                                  UIFontDescriptorFamilyAttribute: @"Georgia",
                                  UIFontDescriptorFeatureSettingsAttribute:@[ lowercaseNumbers ],
                                  }];
UIFont *font = [UIFont fontWithDescriptor:descriptor size:15];

结果:
enter image description here

修改 @ Random832 指出, Georgia 只有小写数字,因此结果无关紧要。但是, @vikingosegundo 确认此代码适用于支持的字体。感谢。

enter image description here

顶行是用

生成的
UIFont *font = [UIFont fontWithName:@"DIN Next LT Pro" size:12];
if (font)
    label.font = font;

第二行

NSDictionary *lowercaseNumbers = @{  UIFontFeatureTypeIdentifierKey:@(kNumberCaseType), UIFontFeatureSelectorIdentifierKey: @(kLowerCaseNumbersSelector)};
UIFontDescriptor *descriptor = [[UIFontDescriptor alloc] initWithFontAttributes:
                                @{UIFontDescriptorFamilyAttribute: @"DIN Next LT Pro",UIFontDescriptorFeatureSettingsAttribute:@[ lowercaseNumbers ]}];
UIFont *font = [UIFont fontWithDescriptor:descriptor size:12];
if (font)
    label.font = font;

答案 1 :(得分:2)

Another question指向正确的方向,但问题是提到表格数字[vs比例]而不是文字与衬里。

看起来您可以使用设置为kNumberCaseType kLowerCaseNumbersSelector的{​​{3}}来显示这样的数字。

CTFontDescriptorCreateCopyWithFeatureHere's another related question