Как изменить размер NSTextView в соответствии с его содержимым?
Я пытаюсь установить атрибутную строку в NSTextView. Я хочу увеличить его высоту на основе его содержимого, изначально оно установлено на какое-то значение по умолчанию.
Итак, я пробовал этот метод:
Я установил контент в NSTextView. Когда мы устанавливаем некоторый контент в NSTextView, его размер автоматически увеличивается. Таким образом, я увеличил высоту своего супер-представления, что соответствует NSScrollView, но NSScrollView не полностью изменяется, он показывает скроллер справа.
float xCoordinate = 15.0;
[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, 10.0)];
[[xContentView textStorage] setAttributedString:xContents];
float xContentViewScrollerHeight = [xfContentView frame].size.height + 2;
[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, xContentViewScrollerHeight)];
Может кто-нибудь предложить мне какой-то способ или метод для решения этой проблемы. Выполняя поиск по Google, я обнаружил, что в UITextView существует метод contentSize, который может получить размер его содержимого, я попытался найти аналогичный метод в NSTextView, но не смог добиться успеха: (
Ответы
Ответ 1
Запросить текстовое представление его менеджер компоновки и его текстовый контейнер. Затем заставить диспетчер компоновки выполнить макет, а затем спросить менеджера макета для используемого прямоугольника для текстового контейнера.
См. также Обзор текстовой системы.
Ответ 2
NSTextView *textView = [[NSTextView alloc] init];
textView.font = [NSFont systemFontOfSize:[NSFont systemFontSize]];
textView.string = @"Lorem ipsum";
[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
textView.frame = [textView.layoutManager usedRectForTextContainer:textView.textContainer];
Ответ 3
+ (float)heightForString:(NSString *)myString font:(NSFont *)myFont andWidth:(float)myWidth andPadding:(float)padding {
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:myString];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];
[textStorage addAttribute:NSFontAttributeName value:myFont
range:NSMakeRange(0, textStorage.length)];
textContainer.lineFragmentPadding = padding;
(void) [layoutManager glyphRangeForTextContainer:textContainer];
return [layoutManager usedRectForTextContainer:textContainer].size.height;
}
Я использовал эту функцию: Documentation
Пример:
float width = textView.frame.size.width - 2 * textView.textContainerInset.width;
float proposedHeight = [Utils heightForString:textView.string font:textView.font andWidth:width
andPadding:textView.textContainer.lineFragmentPadding];
Ответ 4
Основываясь на ответе @Peter Hosey, вот расширение NSTextView в Swift 4.2:
extension NSTextView {
var contentSize: CGSize {
get {
guard let layoutManager = layoutManager, let textContainer = textContainer else {
print("textView no layoutManager or textContainer")
return .zero
}
layoutManager.ensureLayout(for: textContainer)
return layoutManager.usedRect(for: textContainer).size
}
}
}