Техника того, как отформатировать / раскрасить строку NSTextView - PullRequest
7 голосов
/ 26 января 2012

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

Некоторые фрагменты кода о том, как сделать текст жирным

[[textView textStorage] beginEditing];
[[textView textStorage] applyFontTraits:NSFontBoldTrait range:range];
[[textView textStorage] endEditing];

Это, а также размер изменяется с

[[textView textStorage] beginEditing];  
NSFont* font = [[textView textStorage] attribute:NSFontAttributeName atIndex:range.location effectiveRange:nil];

NSFont* newFont = [NSFont fontWithName:[font familyName] 
                                  size:[font pointSize] + size];

[[textView textStorage] addAttribute:NSFontAttributeName 
                               value:newFont 
                               range:range];
[[textView textStorage] endEditing];

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

Нужно ли что-то сбрасывать с помощью setTypingAttributes из NSTextView или я просто что-то здесь упускаю?

1 Ответ

2 голосов
/ 04 февраля 2012

Я думаю, что вы правы с подходом к установке typingAttributes. Ссылка для -setTypingAttributes: говорит

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

Это, кажется, применимо в вашем случае.

Я не знаю, является ли описанное поведение корректным только для WYSIWYG-редакторов, таких как TextEdit. Кажется, вы работаете над чем-то похожим по поведению на редактор с подсветкой синтаксиса. Там вы никогда не захотите менять текстовые атрибуты вручную, а скорее по структуре из грамматики. Вероятно, в этом случае он не подходит, и вам следует сбросить typingAttributes или установить его в соответствии с разбором там.

...