NSTextView在使用自动布局时未正确调整大小

7

我有一个简单的布局,包括一个NSView和它的子视图NSTextView。 NSTextView通过编程方式填充一些生成多行文本。 我使用自动布局将所有内容绑定在一起(全都是通过编程完成的)。 但是,当一切都显示出来时,NSTextView被截断了,只显示了一行。

在搜索网络后,我找到的最好答案是:

使用 Autolayout 来扩展 NSTextViews

然而,这仅在我手动更改NSTextView中的文本后才有效(这实际上并不是我的用例)。 视图会重新调整大小,整个NSTextView都会显示。

我正在尝试弄清楚NSViewController何时完成布置子视图,以便我可以在NSTextView上调用invalidateIntrinsicContentSize。 这相当于UIViewController中的viewDidLayoutSubviews

到目前为止,我尝试过的任何事情都没有奏效。 我尝试为NSTextView调用invalidateIntrinsicContentSize:

  • loadView 结束时
  • 在我填充NSTextView文本之后

有没有更好的方法来实现这个?

1个回答

10
进一步的研究后,找到了答案:
  1. 创建自定义的 NSView 子类,其中包含 NSTextView
  2. NSView 子类中重写 layout 方法,该方法调用 invalidateIntrinsicContentSize

此外,请查看以下链接,该链接解释了自动布局和固有内容大小等微妙之处(以及其他许多内容):

http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

示例代码:

@interface MyView : NSView
  @property MyTextView *textView;
@end

@implementation MyView

// init & create content & set constraints

-(void) layout {
    [super layout];
    [self.textView invalidateIntrinsicContentSize];
}

@end

MyTextView的实现:

@implementation MyTextView

- (NSSize) intrinsicContentSize {
    NSTextContainer* textContainer = [self textContainer];
    NSLayoutManager* layoutManager = [self layoutManager];
    [layoutManager ensureLayoutForTextContainer: textContainer];
    return [layoutManager usedRectForTextContainer: textContainer].size;
}

- (void) didChangeText {
    [super didChangeText];
    [self invalidateIntrinsicContentSize];
}

@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接