Автоматическое изменение размеров NSTextView и / или NSScrollView

У меня есть NSTextView внутри NSView (который используется NSPopover, не знаю, насколько это актуально), что я пытаюсь изменить размер автоматически и программно (см. заголовок).

Я боролся со многими вещами, а именно:

  • Смотря на NSLayoutManager а также usedRectForTextContainer которые дают мне ненормальные значения размера (usedRectForTextContainer : {{0, 0}, {0.001, 28}})
  • Изменение NSScrollView frame, [NSScrollView contentView], [NSScrollView documentView]
  • Избавляемся от AutoLayout

Я достиг точки, где я могу изменить размеры моего scollview и моего Popover, но я не могу получить фактическую высоту текста внутри NSTextView.

Любая помощь будет оценена.

-(void)resize
{
    //Get clipView and scrollView
    NSClipView* clip = [popoverTextView superview];
    NSScrollView* scroll = [clip superview];

    //First, have an extra long contentSize and ScrollView to test everything else
    [popover setContentSize:NSMakeSize([popover contentSize].width, 200)];
    [scroll setFrame:(NSRect){
        [scroll frame].origin.x,[scroll frame].origin.y,
        [scroll frame].size.width,155
    }];



    NSLayoutManager* layout = [popoverTextView layoutManager];
    NSTextContainer* container = [popoverTextView textContainer];

    NSRect myRect = [layout usedRectForTextContainer:container]; //Broken
    //Now what ?

}

2 ответа

Решение

Я до сих пор не знаю, почему я не могу использовать [layout usedRectForTextContainer:container], но мне удалось получить NSTextViewВысота с помощью:

-(void)resize
{
    //Get glyph range for boundingRectForGlyphRange:
    NSRange range = [[myTextView layoutManager] glyphRangeForTextContainer:container];

    //Finally get the height
    float textViewHeight = [[myTextView layoutManager] boundingRectForGlyphRange:range
                                       inTextContainer:container].size.height;
}

Вот некоторый функциональный код, который я сам проверил на swift. usedRectForTextContainer не сломан, он просто установлен лениво. Чтобы установить его, я вызываю glyphrangefortextcontainer

Я нашел ответ здесь: http://stpeterandpaul.ca/tiger/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

    let textStorage = NSTextStorage(string: newValue as! String)
    let textContainer = NSTextContainer(size: NSSize(width: view!.Text.frame.width, height:CGFloat.max))
    let layoutManager = NSLayoutManager()

    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)

    textContainer.lineFragmentPadding = 0.0
    textContainer.lineBreakMode = NSLineBreakMode.ByWordWrapping
    textStorage.font = NSFont(name: "Times-Roman", size: 12)

    layoutManager.glyphRangeForTextContainer(textContainer)

    let rect = layoutManager.usedRectForTextContainer(textContainer)

    Swift.print(rect)

Документация также предполагает, что это так:

фото документации

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