2011-01-26 4 views
12

Имеет ли CoreText какие-либо возможности для выбора варианта SmallCaps шрифта или для синтеза небольших кепок, если шрифт не имеет этой функции? Я не могу найти что-либо в документации CoreText, в которой рассказывается о небольших шапках, хотя есть возможности для решения вариантов/особенностей шрифта. Кто-нибудь сделал что-то подобное этому?Поддерживает ли CoreText небольшие крышки?

ответ

6

Как правило, проще всего использовать CTFontDescriptorCreateCopyWithFeature. Как вы упомянули в своем собственном ответе, это будет работать только для шрифтов, которые фактически реализуют функцию, которую вы запрашиваете.

+0

В моем случае мне также необходимо дополнительно выделить курсив/полужирный шрифт, поэтому мне нужно использовать версию более общих атрибутов. Но вы правы, для простого включения/отключения небольших кепок 'CTFontDescriptorCreateCopyWithFeature' немного проще в использовании. –

10

Ответ представляется квалифицированным Да. Он поддерживает шрифты с функцией Small Caps, но не поддерживает синтез Small Caps в шрифтах, которые не имеют этой функции. Эту функцию можно включить, создав CTFontDescriptor с атрибутом kCTFontFeatureSettingsAttribute, который отображает массив признаков dicts. Ключ kCTFontFeatureTypeIdentifierKey должен быть установлен в 3 для Letter Letter, а kCTFontFeatureSelectorIdentifierKey должен быть установлен на 3 для Small Caps. <ATS/SFNTLayoutTypes.h> содержит константы, которые идентифицируют различные значения, хотя этот заголовок недоступен в SDK iOS.

шрифтов, доступных на IPad, следующая поддержка Small Caps:

  • HoeflerText-Regular
  • HoeflerText-Italic
  • HoeflerText-черный
  • HoeflerText-BlackItalic
  • Didot

Примечание: курсив/полужирный nts в семье Didot не поддерживают небольшие шапки.

+0

Я думаю, что этот заголовок теперь доступен в iOS 5 SDK –

2

Чтобы расширить ответ Кевина Балларда. Значения «3» и «3» работают для системных шрифтов, но не кажутся универсальными. Я использую внешний шрифт, и эти значения не работают.

Вы можете выйти из всех доступных свойств с чем-то вроде этого:

UIFont *font = [UIFont fontWithName: fontName size: fontSize]; 
CFArrayRef fontProperties = CTFontCopyFeatures ((__bridge CTFontRef) font) ; 
NSLog(@"properties = %@", fontProperties); 
CFRelease(fontProperties); 

и определить, что функция шрифта и селектор вам необходимо включить небольшие колпачки и другие особенности шрифта.

5

Я решил ответить здесь, чтобы предоставить более полное решение всем, кто пытается решить эту проблему, поскольку информация здесь неполна.

Это решение использует IOS 7 UIFontDescriptor, как я сейчас заканчиваю поддержку прошивки 6.

Как Энтони Mattox отметил, значение системы шрифтов (которые перечислены в 3 и 3, но следует отметить, на самом деле быть kLetterCaseType и kSmallCapsSelector, вы не должны ссылаться на перечисление по его номеру), не будет работать для пользовательских шрифтов. Я не уверен, что это касается всех пользовательских шрифтов или только некоторых, но я нашел, что это имеет место с моим.

При перекопании в декларацию обоих этих значений перечисления вы можете видеть, что они все равно устарели и, по-видимому, работают только для нескольких системных шрифтов, которые поддерживают небольшие кепки. После регистрации доступных атрибутов для моего пользовательского шрифта, описанного Энтони, я нашел 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]; 
} 

Вы можете использовать эти путем создания шрифта с правильным именем и размером, а затем, вызвав один из этих методов на нем, который будет возвращать небольшая версия этого шрифта. Вам нужно будет найти правильный метод для использования для любого небольшого шрифта, который вы решите использовать.

Возможно, есть умный способ выяснить, какой из них использовать программно во время выполнения, проверяя доступные типы (даже просто проанализируя результаты этого массива свойств шрифтов), но я не потрудился сделать это, поскольку я я использую только несколько разных шрифтов, и для меня подходит ручная проверка.

Edit:

Одна вещь, которую я заметил, что номера обрабатываются отдельно. Если вы хотите, чтобы числа были слишком маленькими (на самом деле их называли «номерами старого стиля» в случае большинства шрифтов, которые его поддерживают), вам нужно будет явно указать атрибут.

Похоже, что он одинаково подходит как для системных шрифтов, так и для пользовательских шрифтов, в отличие от букв.

Вы бы просто добавить этот словарь к каждому из указанных массивов:

@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)} 

Еще раз, для этой работы шрифта сами фактически должно поддерживать этот атрибут.

+0

Этот метод не работает для системного шрифта iOS 7 (Helvetica Neue). – Legoless

+0

@Legoless Чтобы уточнить, это не сработает для Helvetica Neue, потому что этот шрифт не поставляется с небольшим режимом масок. Это будет работать только для шрифтов, которые его запекли в них. В этом ответе на этот вопрос есть список этих шрифтов. Пример системного шрифта, с которым работает WILL, - «Didot». Попробуйте 'smallCapsSystemFont' с этим, и вы увидите его в действии. – Dima

+0

Если вы хотите иметь маленькие кепки с Helvetica Neue, вам нужно будет либо найти версию шрифта, который кто-то другой создал, либо встроил в него, или подделать его, рисуя заглавные буквы меньшего размера. – Dima

0

Как здесь никто не предоставил Swift 4 образца, я просто хочу, чтобы включить код площадки для отображения некоторого небольшого капса текста в UILabel:

//: Playground - noun: a place where people can play  
import UIKit 
import CoreGraphics 

let pointSize : CGFloat = 24 
let fontDescriptor = UIFont(name: "HoeflerText-Regular", size: pointSize)!.fontDescriptor 



let fractionFontDesc = fontDescriptor.addingAttributes(
    [ 
     UIFontDescriptor.AttributeName.featureSettings: [ 
      [ 
       UIFontDescriptor.FeatureKey.featureIdentifier: kLetterCaseType, 
       UIFontDescriptor.FeatureKey.typeIdentifier: kSmallCapsSelector 
      ] 
     ] 
    ]) 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 

label.font = UIFont(descriptor: fractionFontDesc, size:pointSize) 
label.text = "Montpelier, Vermont" 
Смежные вопросы