Визуализация текста в верхнем регистре без изменения строки поддержки? (iOS7 и текстовый комплект)

Мое приложение предназначено только для iOS 7. У меня есть UITextView, представляющий NSAttributedString. Строка представляет собой документ, каждый абзац имеет набор атрибутов для стилизации. Некоторые абзацы необходимо отображать ВСЕМИ ЗАГЛАВНЫМИ БУКВАМИ, однако стиль абзаца может быть изменен пользователем на что-то с обычными заглавными буквами, поэтому исходная заглавная буква строки должна быть сохранена.

Как мне это сделать? Моей первой мыслью было использовать новые функции Text Kit и сделать какую-то замену глифов, но я не могу понять, как это будет работать. Другой мыслью было бы создать собственный шрифт, в котором все символы были бы в верхнем регистре.

Опять же, я не могу просто изменить фоновую строку, поэтому что-то вроде uppercaseString не сработает.


person James J    schedule 20.09.2013    source источник


Ответы (1)


Только что поработав над некоторыми вещами TextKit, я попробую это.

Я бы создал собственный подкласс NSLayoutManager и переопределил:

- (void)setGlyphs:(const CGGlyph *)glyphs properties:(const NSGlyphProperty *)props characterIndexes:(const NSUInteger *)charIndexes font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange

Внутри этого метода вам нужно будет выполнить собственную генерацию глифов, что, хотя и звучит сложно, как указано в документах CoreText на «Получение глифов для символов." По сути, все, что вам нужно сделать, это взять символы из self.textStorage, на которые ссылается characterIndexes, и использовать CFStringCapitalize(), чтобы сделать все заглавными.

Обратите внимание на документацию по методу -setGlyphs:…, так как он имеет некоторые странности.

Надеюсь, это хотя бы укажет вам правильное направление.

person Ben Lachman    schedule 01.11.2013
comment
Этот ответ точен, единственное, что я хотел бы добавить, это то, что вам не нужно создавать подкласс NSLayoutManager, если вы используете метод делегата менеджера компоновки layoutManager:shouldGenerateGlyphs:properties:characterIndexes:font:forGlyphRange: - person leonaka; 24.03.2015