NSTextView没有正确调整自动布局的大小



我有一个简单的布局,它由NSView和它的子视图NSTextView组成。NSTextView以编程方式填充一些生成多行的文本。我使用自动布局将所有内容联系在一起(全部以编程方式完成)。然而,当所有内容都显示时,NSTextView被截断,只显示一行。

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

使用自动布局扩展NSTextViews

然而,这只适用于如果我手动改变文本在NSTextView后的一切显示(这不是我真正的用例)。视图被重新调整,整个NSTextView被显示。

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

到目前为止,我试过的都不起作用。我尝试调用invalidateIntrinsicContentSize for NSTextView:

  • loadView末尾
  • 在我用文本填充NSTextView之后

有更好的方法来实现这一点吗?

经过进一步研究,找到了答案:

  1. 创建包含NSTextView的定制NSView子类
  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

最新更新