【问题标题】:Automatically grow document view of NSScrollView using auto layout?使用自动布局自动增长 NSScrollView 的文档视图?
【发布时间】:2012-06-04 01:47:27
【问题描述】:

有没有一种简单的方法可以让NSScrollView 在使用自动布局时适应其文档视图的大小变化?

我尝试在文档视图、剪辑视图和滚动视图上同时调用setNeedsUpdateConstraints:setNeedsLayout:,但没有任何结果。

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

问题是包含子视图的文档视图在子视图更改其大小时不会重新调整大小,即使它们调用invalidateIntrinsicContentSize。因此,随着文档视图的增长,文档视图的内容会被裁剪为文档视图的原始大小。文档视图在 nib 中创建,并在 awakeFromBib 方法中设置为滚动视图的文档视图。

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

NSPopover 做了类似的事情 - 前提是内容控制器视图的子视图具有正确设置的约束并且各种内容拥抱值足够高(例如,高于隐藏弹出窗口的高约束优先级)。

【问题讨论】:

  • 我不确定我是否理解您的意图——滚动视图旨在滚动其文档视图的整个长度。为什么要让它随着内容视图的大小而改变大小?

标签: cocoa resize nsscrollview autolayout


【解决方案1】:

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

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

// Assume self.docView is an IBOutlet populated with
// an NSView subclass
self.docView.translatesAutoresizingMaskIntoConstraints = NO;

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

self.scrollView.documentView = self.docView;

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

【讨论】:

  • 有没有人有任何提示可以使用在 IB 中创建的滚动视图和子视图而不是在代码中设置?一个想法:手动删除awakeFromNib中自动添加的约束,替换为我自己的。另一个想法:从其父视图中删除文档视图,在设置标志后将其添加回来。如果我发现其中一个效果很好,我会再次发布。
  • 是的,第二个想法奏效了。对于我在 IB 中设置的视图,我让 awakeFromNib 从其父视图中删除了 documentView,将 translates.. 设置为 NO 并将其添加回来。最后它添加了约束 @"H:|[docview]|"和@"V:|[docview]" 到 docview.superview。
  • 你有更多的演示代码吗?特别是显示您添加的约束?有点卡在这个;-)
  • 如果在滚动视图的 documentView 子类中重写 - (NSSize)intrinsicContentSize,滚动视图将添加自己的类型为 NSContentSizeLayoutConstraint 的约束,即使在 documentView 上 translatesAutoresizingMaskIntoConstraints=NO 也是如此。这些约束设置宽度、高度、内容拥抱和压缩阻力。约束可能与-intrinsicContentSize 返回的大小不同。如果您不覆盖-intrinsicContentSizetranslatesAutoresizingMaskIntoConstraints=NO 将阻止滚动视图将其约束添加到文档视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多