NSTextView无法使用自动布局正确调整大小

yur*_*ura 6 cocoa objective-c nsviewcontroller

我有一个简单的布局,它包含NSView及其子视图NSTextView.NSTextView以编程方式填充了一些产生多行的文本.我使用自动布局(所有以编程方式完成)将所有内容绑定在一起.但是,当显示所有内容时,NSTextView被切断,只显示一行.

搜索网络后,我能找到的最佳答案是:

使用Autolayout扩展NSTextViews

但是,这只有在我显示所有内容后手动更改NSTextView中的文本时才有效(这不是我的用例).视图重新调整,并显示整个NSTextView.

我试图找出NSViewController何时完成布局子视图,以便我可以调用invalidateIntrinsicContentSizeNSTextView.相当于viewDidLayoutSubviewsUIViewController.

到目前为止我没有尝试过任何工作.我试图调用invalidateIntrinsicContentSizeNSTextView:

  • 在......的最后 loadView
  • 在我用我的文本填充NSTextView之后

有没有更好的方法来实现这一目标?

yur*_*ura 7

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

  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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)