Я решил ответить здесь, чтобы предоставить более полное решение для всех, кто пытается решить эту проблему, поскольку информация здесь неполная.
В этом решении используется iOS 7 UIFontDescriptor
, так как сейчас я прекращаю поддержкудля iOS 6.
Как указал Энтони Мэттокс, значения системных шрифтов (которые указаны как 3 и 3, но следует отметить, что на самом деле это kLetterCaseType
и kSmallCapsSelector
, не следует ссылаться на enumпо его номеру), не будет работать для пользовательских шрифтов.Я не уверен, так ли это для всех пользовательских шрифтов или только для некоторых, но я обнаружил, что это так и с моими.
При копировании в объявление обоих этих значений перечисления вы можете увидеть, что они все равно устарели и предположительно работают только для тех немногих системных шрифтов, которые поддерживают маленькие заглавные буквы.После регистрации доступных атрибутов для моего настраиваемого шрифта, как описано Энтони, я нашел 2 правильных атрибута, которые нужно использовать для настраиваемых шрифтов.Это kLowerCaseType
и kLowerCaseSmallCapsSelector
.Я считаю, что эта комбинация является единственной другой опцией, поэтому для любого шрифта, который вы пытаетесь использовать, это будет один или другой.
Я написал несколько методов категории для инкапсуляции этой функциональности в обоих случаях:
- (UIFont *) smallCapSystemFont
{
UIFontDescriptor *descriptor = [self fontDescriptor];
NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLetterCaseType),
UIFontFeatureSelectorIdentifierKey : @(kSmallCapsSelector)}];
descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}];
return [UIFont fontWithDescriptor:descriptor size:0];
}
- (UIFont *) smallCapCustomFont
{
UIFontDescriptor *descriptor = [self fontDescriptor];
NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLowerCaseType),
UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector)}];
descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}];
return [UIFont fontWithDescriptor:descriptor size:0];
}
Вы используете их, создавая шрифт с правильными именем и размером, а затем вызывая один из этих методов, который вернет версию этого шрифта в маленькой заглавной букве.Вам нужно будет найти правильный метод для использования любого шрифта с маленькими заглавными буквами, который вы решите использовать.
Возможно, есть умный способ выяснить, какой из них использовать программно во время выполнения, проверяя доступные типы (даже просто анализируя результаты этого массива свойств шрифта), но я не потрудился сделать это, так какЯ использую только несколько разных шрифтов, и мне подходит ручная проверка.
Редактировать:
Одна вещь, которую я заметил, заключается в том, что числа обрабатываются отдельно.Если вы хотите, чтобы числа тоже были небольшими (это на самом деле называется «числами в старом стиле» в случае большинства шрифтов, которые его поддерживают), вам понадобится это явно в качестве атрибута.
Похожеон одинаков как для системных шрифтов, так и для пользовательских, в отличие от букв.
Вы просто добавили бы этот словарь в каждый из приведенных выше массивов:
@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType),
UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)}
Еще раз, чтобыработать сам шрифт фактически должен поддерживать этот атрибут.