5

我有一个NSTextView内部 an NSView(正在被 a 使用NSPopover,不知道这是否相关),我正在尝试以编程方式自动调整大小(cf 标题)。

在此处输入图像描述

我一直在努力解决很多问题,即:

  • 看着NSLayoutManagerusedRectForTextContainer这给了我异常的尺寸值(usedRectForTextContainer : {{0, 0}, {0.001, 28}}
  • 修改NSScrollView frame, [NSScrollView contentView],[NSScrollView documentView]
  • 摆脱自动布局

我达到了可以调整 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 ?

}
4

2 回答 2

4

我仍然不知道为什么我不能使用[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;
}
于 2013-11-05T08:58:07.393 回答
3

这是我自己测试过的一些功能代码。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)

该文档还表明是这种情况:

文件图片

于 2016-09-10T17:19:02.523 回答