在iOS上以小型大写字体排版字体

时间:2012-10-17 19:34:43

标签: ios fonts

在iOS上,我在项目中加载自定义字体,方法是将其文件名(.otf文件)添加到info.plist文件中,然后使用以下代码行:

  

UIFont myFont * = [UIFont fontWithName:titleFontName size:titleFontSize];

我获得了可以在UILabels和UITextViews中使用的字体。

如何才能获得此字体仅以小型大写字母显示?如果我在Photoshop中使用它,可以打开小型大写字母开关,将所有单词排版成小型大写字母(因此,我得出结论,字体没有任何缺失)。我怎么能在iOS上获得类似的效果?

由于其他原因,将我的字符串转换为大写不是可行的选择。

更多信息:该字体在其系列中只有一个成员,我可以通过使用以下代码理解,该系列中没有独立的小型成员。

 for (NSString * familyName in [UIFont familyNames]) {

        NSLog(@"---------------- %@ ---------------", familyName);
        for (NSString * fontName in[UIFont fontNamesForFamilyName:familyName] )
           NSLog(@"- %@", fontName);
   }

2 个答案:

答案 0 :(得分:18)

通过开放式功能在字体中启用小型大写字母。在iOS 7中,我们可以使用字体描述符来访问开放式功能并启用小型上限。

This question介绍了如何使用核心文本打开小型大写字母,但同样可以轻松地为UIFonts和UIKit视图做同样的事情。您需要创建UIFontDescriptor并将UIFontDescriptorFeatureSettingsAttribute设置为要启用的功能的字典数组。

每个字体要素字典都包含用于指定要素类型的键和值,以及要素选择器的键和值。根据您使用的字体,您需要找到与小型大写相对应的正确值。您可以在注释部分记录的数组中找到它们。

UIFont类别

此类别将生成启用了小型大写的UIFont对象。您需要添加正确的字体名称。

#import "UIFont+SmallCaps.h"
#import <CoreText/CoreText.h>

@implementation UIFont (SmallCaps)

+ (UIFont *) applicationSmallCapsFontWithSize:(CGFloat) size {
    /*
    // Use this to log all of the properties for a particular font
    UIFont *font = [UIFont fontWithName: fontName size: fontSize];
    CFArrayRef  fontProperties  =  CTFontCopyFeatures ( ( __bridge CTFontRef ) font ) ;
    NSLog(@"properties = %@", fontProperties);
    */

    NSArray *fontFeatureSettings = @[ @{ UIFontFeatureTypeIdentifierKey: @(kLowerCaseType),
                                         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector) } ];

    NSDictionary *fontAttributes = @{ UIFontDescriptorFeatureSettingsAttribute: fontFeatureSettings ,
                                      UIFontDescriptorNameAttribute: FONT_NAME } ;

    UIFontDescriptor *fontDescriptor = [ [UIFontDescriptor alloc] initWithFontAttributes: fontAttributes ];

    return [UIFont fontWithDescriptor:fontDescriptor size:size];
}

@end

答案 1 :(得分:10)

Swift中UIFont的扩展名:

extension UIFont {

    func smallCaps() -> UIFont {

        let settings = [[UIFontFeatureTypeIdentifierKey: kLowerCaseType, UIFontFeatureSelectorIdentifierKey: kLowerCaseSmallCapsSelector]]
        let attributes: [String: AnyObject] = [UIFontDescriptorFeatureSettingsAttribute: settings, UIFontDescriptorNameAttribute: fontName]

        return UIFont(descriptor: UIFontDescriptor(fontAttributes: attributes), size: pointSize)
    }
}

<强>用法:

label.font = UIFont(name: "SourceSansPro-Regular", size: 12)?.smallCaps()

示例:

enter image description here enter image description here

macOS版本:

extension NSFont {
    func smallCaps() -> NSFont? {
        let settings = [[NSFontFeatureTypeIdentifierKey: kLowerCaseType, NSFontFeatureSelectorIdentifierKey: kLowerCaseSmallCapsSelector]]
        let attributes: [String: AnyObject] = [NSFontFeatureSettingsAttribute: settings as AnyObject, NSFontNameAttribute: fontName as AnyObject]

        return NSFont(descriptor: NSFontDescriptor(fontAttributes: attributes), size: pointSize)
    }
}

重要:

  • 并非所有字体都适用它,这取决于字体是否包含在字体中,因为 @Anthony Mattox 表示。

  • 请记住将字符串设置为:Example,而不是EXAMPLE

  • 设置为Array<NDSictionary>,而非NSDictonary