Имеет ли CoreText какие-либо возможности для выбора варианта SmallCaps шрифта или для синтеза небольших кепок, если шрифт не имеет этой функции? Я не могу найти что-либо в документации CoreText, в которой рассказывается о небольших шапках, хотя есть возможности для решения вариантов/особенностей шрифта. Кто-нибудь сделал что-то подобное этому?Поддерживает ли CoreText небольшие крышки?
ответ
Как правило, проще всего использовать CTFontDescriptorCreateCopyWithFeature
. Как вы упомянули в своем собственном ответе, это будет работать только для шрифтов, которые фактически реализуют функцию, которую вы запрашиваете.
Ответ представляется квалифицированным Да. Он поддерживает шрифты с функцией 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 не поддерживают небольшие шапки.
Я думаю, что этот заголовок теперь доступен в iOS 5 SDK –
Чтобы расширить ответ Кевина Балларда. Значения «3» и «3» работают для системных шрифтов, но не кажутся универсальными. Я использую внешний шрифт, и эти значения не работают.
Вы можете выйти из всех доступных свойств с чем-то вроде этого:
UIFont *font = [UIFont fontWithName: fontName size: fontSize];
CFArrayRef fontProperties = CTFontCopyFeatures ((__bridge CTFontRef) font) ;
NSLog(@"properties = %@", fontProperties);
CFRelease(fontProperties);
и определить, что функция шрифта и селектор вам необходимо включить небольшие колпачки и другие особенности шрифта.
Я решил ответить здесь, чтобы предоставить более полное решение всем, кто пытается решить эту проблему, поскольку информация здесь неполна.
Это решение использует 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)}
Еще раз, для этой работы шрифта сами фактически должно поддерживать этот атрибут.
Этот метод не работает для системного шрифта iOS 7 (Helvetica Neue). – Legoless
@Legoless Чтобы уточнить, это не сработает для Helvetica Neue, потому что этот шрифт не поставляется с небольшим режимом масок. Это будет работать только для шрифтов, которые его запекли в них. В этом ответе на этот вопрос есть список этих шрифтов. Пример системного шрифта, с которым работает WILL, - «Didot». Попробуйте 'smallCapsSystemFont' с этим, и вы увидите его в действии. – Dima
Если вы хотите иметь маленькие кепки с Helvetica Neue, вам нужно будет либо найти версию шрифта, который кто-то другой создал, либо встроил в него, или подделать его, рисуя заглавные буквы меньшего размера. – Dima
Как здесь никто не предоставил 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"
- 1. Есть ли хороший блочный шифр, который поддерживает небольшие размеры блоков?
- 2. Поддерживает ли Linux кеш (небольшие) файлы для оптимизации ввода-вывода?
- 3. Capistrano: развертывание крышки и развертывание крышки: обновление
- 4. Есть ли эквивалент CoreText для iPhone SDK?
- 5. Является ли CoreText быстрее, чем Text Kit?
- 6. Является ли CoreText способ отображения форматированного текста?
- 7. CoreText эквивалента [NSFont fontWithName]
- 8. Android, чтобы CoreText
- 9. Картинговые символы CoreText
- 10. CoreText - Пространства не обертываются?
- 11. Можно ли вырваться из крышки в groovy
- 12. CoreText, Copy & Paste
- 13. прокрутки CoreText в UIScrollView
- 14. CoreText с многоколоночным изображением?
- 15. CoreText: Пробел между линиями
- 16. Создать CGContext для CoreText
- 17. Алгоритм независимой крышки вершины
- 18. Определение крышки вершин
- 19. Скрытые крышки UITabBarController Кнопка
- 20. Использование крышки в Swift
- 21. Размер фона: обложка крышки
- 22. Настройка сканирования крышки?
- 23. Как установить ведущий в CoreText?
- 24. вариация на множество крышки
- 25. Пример представления текста CoreText (CTPageViewer)
- 26. Изменение размера UIView для CoreText
- 27. Ошибки компиляции CoreText через DTCoreText
- 28. CoreText с серым цветовым пространством
- 29. поток крышки в Iphone
- 30. Эмуляция жесткой крышки клавиатуры
В моем случае мне также необходимо дополнительно выделить курсив/полужирный шрифт, поэтому мне нужно использовать версию более общих атрибутов. Но вы правы, для простого включения/отключения небольших кепок 'CTFontDescriptorCreateCopyWithFeature' немного проще в использовании. –