Я пытаюсь измерить высоту NSAttributedString
«s учитывая постоянную ширину, используя следующий метод:NSLayoutManager/NSTextContainer Игнорирует Scale Factor
-(CGFloat)calculateHeightForAttributedString:(NSAttributedString*)attributedNotes {
CGFloat scrollerWidth = [NSScroller scrollerWidthForControlSize:NSRegularControlSize scrollerStyle:NSScrollerStyleLegacy];
CGFloat width = self.tableView.frame.size.width - self.cellNotesWidthConstraint - scrollerWidth;
// http://www.cocoabuilder.com/archive/cocoa/54083-height-of-string-with-fixed-width-and-given-font.html
NSTextView *tv = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, width - 20, 1e7)];
tv.font = [NSFont userFontOfSize:32];
[tv.textStorage setAttributedString:attributedNotes];
[self setScaleFactor:[self convertSliderValueToFontScale:self.fontScaleSlider] forTextView:tv];
[tv.layoutManager glyphRangeForTextContainer:tv.textContainer];
[tv.layoutManager ensureLayoutForTextContainer:tv.textContainer];
return [tv.layoutManager usedRectForTextContainer:tv.textContainer].size.height + 10.0f; // add a little bit of a buffer
}
В основном, ширина размер табличного представления минус скроллер и немного бит каждой ячейки, которая используется для отображения другой информации. Этот метод работает очень хорошо, пока масштаб текста (через convertSliderValueToFontScale:
) равен 1,0. Результат от usedRectForTextContainer
неверен, если изменить масштабный коэффициент, однако, как если бы масштабный коэффициент не учитывался.
Шкала устанавливается в setScaleFactor:forTextView:
на NSTextView следующим образом (скаляр фактическая шкала сумма):
[textView scaleUnitSquareToSize:NSMakeSize(scaler, scaler)];
Любые идеи о том, как это исправить?
Редактировать: У меня есть образец проекта, чтобы попробовать здесь: Github. Как ни странно, все работает, если масштаб < 0, и они случайно, кажется, работают в диапазоне 4.xxx по случаю ...
Как я понимаю, 'scaleUnitSquareToSize' изменяет размер точек, число точек в локальных координатах остается неизменным. – Willeke
Я бы предположил, что NSLayoutManager/NSTextContainer знает ** что-то ** о 'scaleUnitSquareToSize', учитывая тот факт, что перенос текста корректируется по мере расширения текста (при условии, что ваш NSScrollView имеет горизонтальную прокрутку отключен). – Deadpikle
'[tv sizeToFit]' может помочь. – Willeke