Авторазмер NSTextView и его размер шрифта - PullRequest
2 голосов
/ 28 января 2012

Я пытаюсь сделать мой NSWindow автоматически изменяемым размером. Я изменил размеры большинства своих элементов пользовательского интерфейса, но одним из немногих оставшихся объектов, которые создают проблемы, являются NSTextViews: действительно, я не могу найти способ рассчитать новый размер шрифта после изменения размера NSTextView.

Для NSTextFields я нашел метод, который бы определял размер шрифта в зависимости от длины текста. По-видимому, не существует эквивалентного метода для многострочных текстовых контейнеров (если я просто не нашел его).

Единственное место, где я обнаружил что-то подобное, это здесь: http://boutcher.tumblr.com/post/7842216960/nstextview-auto-resizing-text

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

Кто-нибудь делал это в прошлом? Я подумываю просто позволить пользователю изменить размер до всего одного размера, чтобы я мог жестко закодировать размер шрифта ... Работать с этими NSTextViews очень сложно!

1 Ответ

1 голос
/ 30 января 2012

См. Метод sizeWithAttributes: в «Справочнике по дополнениям NSString Application Kit».

Возвращает NSSize, который можно сравнить с текущим frame.size для textview.

Для «Атрибуты »arg создает NSDictionary с NSFont в качестве объекта и NSFontAttributeName в качестве ключа.(Не смущайтесь этой константой. Похоже, это ключ для строки, но это не так; это ключ для самого шрифта.)

Получить строку из textview: [[yourTextView textStorage] string].Получите familyName используемого шрифта и его текущий размер точки, CGFloat.Составьте шрифты для тестирования, используя конструктор [NSFont fontWithName:familyName size:floatChanged].

Как только вы получите шрифт правильного размера, используйте его для создания новой строки NSAttributedString из старой строки.Просто используйте словарь «атрибутов», который вы создали выше (тот, который дал правильный размер) и передайте его в конструктор initWithString:attributes NSAttributedString.

Назначьте эту атрибутивную строку textStorage (сам подкласс NSMutableAttributedString):[[yourTextView textStorage] setAttributedString:thatYouJustMade].

Примечание. Если в текстовом представлении используются такие атрибуты, как подчеркивание или выделение цветом перед / фоном или выделенные курсивом / жирным шрифтом, вы должны получить эту информацию из textStorage и включить ее в новую приписанную строку.Это выполнимоПосмотрите на ссылки на классы для NSAttributedString и NSMutableAttributedString.

...