Как изменить размер NSTextView в соответствии с его содержанием? - PullRequest
19 голосов
/ 16 апреля 2010

Я пытаюсь установить атрибутивную строку в 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, но не смог добиться успеха: (

Ответы [ 4 ]

17 голосов
/ 16 апреля 2010
6 голосов
/ 03 апреля 2017
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];
1 голос
/ 17 января 2019

Основываясь на ответе @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
        }
    }
}
1 голос
/ 07 июля 2017
+ (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;
}

Я сделал функцию, используя эту ссылку: Документация

Пример:

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];
...