使用自动布局自动增长NSScrollView的文档视图?

Mon*_*olo 15 cocoa resize nsscrollview autolayout

NSScrollView在使用自动布局时,是否有一种简单的方法可以适应其文档视图更改大小?

我曾尝试都调用setNeedsUpdateConstraints:,并setNeedsLayout:在文档视图,夹视图和滚动视图,没有任何结果.

fittingSize 文档视图报告正确的大小.

问题是,当子视图改变其大小时,即使他们调用,也不会重新调整保存子视图的文档视图的大小invalidateIntrinsicContentSize.因此,文档视图的内容在它们增长时被剪切为文档视图的原始大小.文档视图在笔尖中创建,并在awakeFromBib方法中设置为滚动视图的文档视图.

我希望文档视图框在其fittingSize更改时自动进行调整,并相应地更新滚动条.

NSPopover 做类似的事情 - 假设内容控制器视图的子视图设置了正确的约束,并且各种内容拥抱值足够高(高于隐藏的弹出窗口的高约束优先级,对于一个).

Mon*_*olo 15

问题当然是在添加文档视图时,Cocoa会在文档视图插入的视图中自动创建一些硬约束,即剪辑视图.

所以我自己的问题的答案很简单,只需使用:

// Assume self.docView is an IBOutlet populated with
// an NSView subclass
self.docView.translatesAutoresizingMaskIntoConstraints = NO;
Run Code Online (Sandbox Code Playgroud)

在将文档视图添加到滚动视图之前:

self.scrollView.documentView = self.docView;
Run Code Online (Sandbox Code Playgroud)

现在,由于剪辑视图中的文档视图布局没有自动生成的约束,因此您需要显式添加它们.否则,doc视图的内容将在滚动视图的左上角以其固有大小呈现.

  • 是的,第二个想法奏效了.对于我在IB中设置的视图,我有awakeFromNib从其superview中删除documentView,将translate设置为NO并将其添加回来.最后它添加约束@"H:| [docview] |" 和@"V:| [docview]"到docview.superview. (4认同)