我有一个简单的布局,它由 NSView 及其 subview NSTextView 组成。 NSTextView 以编程方式填充了一些生成多行的文本。我使用自动布局将所有内容绑定(bind)在一起(全部以编程方式完成)。但是,当显示所有内容时,NSTextView 被截断,只显示一行。
在网上搜索后,我能找到的最佳答案是:
Using Autolayout with expanding NSTextViews
但是,这仅在我在显示所有内容后手动更改 NSTextView 中的文本时才有效(这实际上不是我的用例)。重新调整 View 并显示整个 NSTextView。
我试图找出 NSViewController 何时完成 subview 的布局,以便我可以在 NSTextView 上调用 invalidateIntrinsicContentSize
。相当于 UIViewController 中的 viewDidLayoutSubviews
。
到目前为止,我尝试过的都没有奏效。我尝试为 NSTextView 调用 invalidateIntrinsicContentSize
:
- 在
loadView
的最后 - 在我用文本填充 NSTextView 之后
有没有更好的方法来实现这一点?
最佳答案
经过进一步研究,找到了答案:
- 创建包含
NSTextView
的自定义NSView
子类> - 在
NSView
子类中覆盖调用invalidateIntrinsicContentSize
的layout
方法
另请查看此链接,该链接解释了自动布局和内在内容大小(以及许多其他内容)的微妙之处:
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/