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

标签 objective-c cocoa nsviewcontroller

我有一个简单的布局,它由 NSView 及其 subview NSTextView 组成。 NSTextView 以编程方式填充了一些生成多行的文本。我使用自动布局将所有内容绑定(bind)在一起(全部以编程方式完成)。但是,当显示所有内容时,NSTextView 被截断,只显示一行。

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

Using Autolayout with expanding NSTextViews

但是,这仅在我在显示所有内容后手动更改 NSTextView 中的文本时才有效(这实际上不是我的用例)。重新调整 View 并显示整个 NSTextView。

我试图找出 NSViewController 何时完成 subview 的布局,以便我可以在 NSTextView 上调用 invalidateIntrinsicContentSize。相当于 UIViewController 中的 viewDidLayoutSubviews

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

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

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

最佳答案

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

  1. 创建包含 NSTextView 的自定义 NSView 子类>
  2. NSView 子类中覆盖调用 invalidateIntrinsicContentSizelayout 方法

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

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

关于objective-c - NSTextView 无法使用自动布局正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24210153/

相关文章:

ios - -[UITableView _configureCellForDisplay :forIndexPath:], 中的断言失败

iphone - 如何在 subview 中设置触摸事件?

objective-c - 如何在基于页面 View 的应用程序中加载 pdf 文件

objective-c - 在 xcode 中创建和使用汇编程序库

objective-c - 如何在 NSWindow 上显示像素数组?

swift - iCarousel 仅在调整大小后显示图像

ios - 'initwithidentifer' 之前是什么?

nsview - 如何配置 NSWindowController、NSViewController 和 NSView

macos - 屏幕中央窗口

objective-c - 获取并突出显示 NSTextView 中的当前单词