Авторазмер NSTextView и его размер шрифта

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

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

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

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

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

1 ответ

Решение

Увидеть sizeWithAttributes: метод в "Справочнике по наборам приложений NSString".

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

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

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

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

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

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

Другие вопросы по тегам