11

在 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);
   }
4

2 回答 2

18

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

这个问题涉及如何使用核心文本打开小型大写字母,但对于 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
于 2013-10-11T19:53:07.700 回答
10

UIFontSwift 中的扩展:

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()

例子:

在此处输入图像描述 在此处输入图像描述

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
于 2016-06-20T15:50:26.057 回答