macos - 启用 NSScrollView 使用 Interface Builder 中的自动布局滚动其内容

标签 macos cocoa interface-builder autolayout nsscrollview

我已经实现了一个自定义的NSView,其中包含许多NSTextField和其他NSView。然后,我使用编辑器 > 嵌入 > ScrollView 将该自定义 View 嵌入到 ScrollView 中。这将创建在大纲中可见的适当层次结构,但我需要添加自动布局约束来指定此 ScrollView 应放置在 View 中的位置(顶部、底部、前导、尾随)。此外,我必须为自定义 View 添加约束,针对剪辑 View 设置,以便将元素布局在正确的位置。这很有效,当我运行应用程序时,所有元素都会正确显示,并且 View 会弹跳滚动。但是,当我减小主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,并且当我更新框架时,它会再次增加 View 的高度。为了解决这个问题,我必须删除 ScrollView 对主视图的底部约束。现在,当我运行应用程序时,窗口设置为正确的大小,但我无法滚动自定义 View 以到达内容的底部 - 它受到限制,因此除了弹性反弹效果之外,它根本不会滚动,因为你' re 处于边缘极限。所以我的问题是,当我在 XIB 中布局所有元素并使用自动布局时,我必须做什么才能允许此 ScrollView 滚动?

最佳答案

这是一般方法:

  • 使文档 View 至少与剪辑 View 一样高。或者,等效地,使剪辑 View 不高于文档 View 。
  • 允许文档 View 的高度增长,但不要缩小到超出其 subview 所需的高度。
  • 在考虑到其他约束的情况下,通过设置低优先级约束使其尽可能小,从而防止文档 View 中出现歧义。

因此,例如,剪辑 View 的底部和文档 View 的底部之间应该存在约束,但它应该是不等式:Superview.Bottom <= Document View.Bottom。 (或者等效地,Document View.Bottom >= Superview.Bottom。)

在文档 View 中,您可能在底部有一些文本字段或其他内容,并且其与文档 View 底部之间存在约束。使该约束成为不等式:Superview.Bottom >= Text Field.Bottom + 标准间距。

这将导致文档 View 的高度不明确。它可以是任何高度足以容纳其所有 subview 的尺寸。添加高度限制。将其优先级设置为 51,并将常量设置为 0。也就是说,它希望使 View 具有 0 高度,但优先级非常低,因此几乎任何其他内容都会取代它。但它解决了歧义。

如果你想允许水平滚动,你需要在水平方向上做同样的事情。

<小时/>

更新:

还有另一种方法。配置文档 View 中的约束以赋予其严格的大小(无不平等)。这通常是从其顶部到顶部 subview 、从该 subview 的底部到另一个 subview 的顶部等、以及从底部 subview 的底部到文档 View 的底部的一系列约束。前导到尾随也是如此。

然后,剪辑 View 和文档 View 之间唯一必要的约束是顶部约束和前导约束。

如果您在此配置中进行测试,您将能够调整大小并且 ScrollView 将滚动。所以,那很好。但是,当 ScrollView 的内容区域比文档 View 高时,文档 View 将固定到内容区域的底部。在这种情况下,您通常希望将其固定在顶部。

原因是剪辑 View 没有翻转。此外,它还调整其边界以匹配文档 View 。因此,即使存在将文档 View 固定到剪辑 View 顶部的限制,剪辑 View 的顶部也不是您期望的位置。剪辑 View 将文档 View 置于 (0, 0),即底部。

因此,最后一步是创建 NSClipView 的子类,它重写 -isFlipped 以返回 YES。然后,将 NIB 中剪辑 View 的类设置为您的子类。之后,它将按照您的要求工作。

关于macos - 启用 NSScrollView 使用 Interface Builder 中的自动布局滚动其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29241474/

相关文章:

ios - 如何保持本地化 Storyboard 或 XIB 同步?

c++ - 如何打开AVCodec?

macos - 操作系统 X : update draw during fullscreen animation

objective-c - NSTimer 在 OS X(OS X 10.9) 上不正确

objective-c - 有没有办法查看撤消堆栈?

ios - 如何覆盖 "default"导航栏?

macos - 使用带有检查器的 Makefile 构建 clang 时出现链接器错误

Xcode IB : Inexplicable area?

objective-c - NSRulerView 如何正确对齐行号与正文

cocoa - IBOutlet 未在 Cocoa MVC 项目中设置