Набор шрифтов в маленьких кешках на 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
.