我有一个简单的布局,它由NSView和它的子视图NSTextView组成。NSTextView以编程方式填充一些生成多行的文本。我使用自动布局将所有内容联系在一起(全部以编程方式完成)。然而,当所有内容都显示时,NSTextView被截断,只显示一行。
在网上搜索后,我能找到的最好的答案是:
使用自动布局扩展NSTextViews
然而,这只适用于如果我手动改变文本在NSTextView后的一切显示(这不是我真正的用例)。视图被重新调整,整个NSTextView被显示。
我试图弄清楚NSViewController何时完成布局子视图,以便我可以在NSTextView上调用invalidateIntrinsicContentSize
。相当于UIViewController中的viewDidLayoutSubviews
。
到目前为止,我试过的都不起作用。我尝试调用invalidateIntrinsicContentSize
for NSTextView:
-
loadView
末尾 - 在我用文本填充NSTextView之后
有更好的方法来实现这一点吗?
经过进一步研究,找到了答案:
- 创建包含
NSTextView
的定制NSView
子类 - 在
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