Как получить высоту для NSAttributedString при фиксированной ширине - PullRequest
48 голосов
/ 17 февраля 2010

Я хочу сделать несколько рисунков NSAttributedStrings в полях фиксированной ширины, но у меня возникают проблемы с вычислением правильной высоты, которую они будут поднимать при рисовании. Пока что пробовал:

  1. Вызов - (NSSize) size, но результаты бесполезны (для этой цели), так как они дадут любую ширину, какую пожелает строка.

  2. Вызов - (void)drawWithRect:(NSRect)rect options:(NSStringDrawingOptions)options с прямоугольником в нужную ширину и NSStringDrawingUsesLineFragmentOrigin в опциях, точно так же, как я использую в своем чертеже. Результаты ... трудно понять; конечно не то, что я ищу. (Как указано в ряде мест, включая эту ветку Cocoa-Dev).

  3. Создание временного NSTextView и выполнение:
    [[tmpView textStorage] setAttributedString:aString];<br> [tmpView setHorizontallyResizable:NO];<br> [tmpView sizeToFit];
    Когда я запрашиваю фрейм tmpView, ширина остается желаемой, а высота часто правильной ... пока я не получу более длинные строки, когда это часто вдвое меньше требуемого размера. (Похоже, что максимальный размер не ударил: один кадр будет иметь высоту 273,0 (около 300 слишком коротко), а другой - 478,0 (только 60-кратный слишком короткий)).

Буду признателен за любые указатели, если бы кто-то еще справился с этим.

Ответы [ 12 ]

0 голосов
/ 24 июля 2017

Как и многие парни, упомянутые выше, и основываясь на моем тесте.

Я использую open func boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], context: NSStringDrawingContext?) -> CGRect на iOS, как показано ниже:

let rect = attributedTitle.boundingRect(with: CGSize(width:200, height:0), options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil)

Здесь 200 - это фиксированная ширина , как и ожидалось, высота. Я даю ей 0 , так как я думаю, лучше сказать, что высота API неограничена .

Опция здесь не так важна , Я попробую .usesLineFragmentOrigin или .usesLineFragmentOrigin.union(.usesFontLeading) или .usesLineFragmentOrigin.union(.usesFontLeading).union(.usesDeviceMetrics), это даст тот же результат.

И результат ожидается как мой, хотя.

Спасибо.

0 голосов
/ 21 апреля 2016

Ни один ответ на этой странице не работал для меня, равно как и этот древний старый код Objective-C из документации Apple . То, что я наконец-то получил для работы с UITextView, это сначала установив для него свойство text или attributedText, а затем вычислил необходимый размер:

let size = textView.sizeThatFits(CGSize(width: maxWidth, height: CGFloat.max))

Работает отлично. Booyah!

...