Набор шрифтов в маленьких кешках на iOS

В 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);
   }

Ответ 1

Маленькие кепки включены в шрифт через функцию открытого типа. В 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

Ответ 2

Расширение для UIFont в Swift:

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, not Example.

  • настройки Array<NDSictionary>, а не NSDictonary.