yur*_*ura 6 cocoa objective-c nsviewcontroller
我有一个简单的布局,它包含NSView及其子视图NSTextView.NSTextView以编程方式填充了一些产生多行的文本.我使用自动布局(所有以编程方式完成)将所有内容绑定在一起.但是,当显示所有内容时,NSTextView被切断,只显示一行.
搜索网络后,我能找到的最佳答案是:
但是,这只有在我显示所有内容后手动更改NSTextView中的文本时才有效(这不是我的用例).视图重新调整,并显示整个NSTextView.
我试图找出NSViewController何时完成布局子视图,以便我可以调用invalidateIntrinsicContentSizeNSTextView.相当于viewDidLayoutSubviewsUIViewController.
到目前为止我没有尝试过任何工作.我试图调用invalidateIntrinsicContentSizeNSTextView:
loadView有没有更好的方法来实现这一目标?
经过进一步研究,找到了答案:
NSView包含的自定义子类NSTextViewNSView子类重写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)
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |