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

Jor*_*n H 7 macos cocoa interface-builder nsscrollview autolayout

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

Ken*_*ses 13

这是一般方法:

  • 使文档视图至少与剪辑视图一样高.或者,等效地使剪辑视图不高于文档视图.
  • 允许文档视图在高度上增长,但不会超出其子视图所需的范围.
  • 通过使用低优先级约束来防止文档视图中的歧义,以使其在给定其他约束的情况下尽可能小.

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

在文档视图中,您可能在底部有一些文本字段或某些内容,以及它与文档视图底部之间的约束.使该约束成为不等式:Superview.Bottom> = Text Field.Bottom +标准间距.

这将导致文档视图的高度模糊不清.它可以是足够大的任何尺寸以适合其所有子视图.添加高度约束.将其优先级设置为51并将其常量设置为0.也就是说,它希望使视图具有0高度,但是处于非常低的优先级,因此几乎任何其他东西都将取代它.但它解决了模棱两可的问题.

如果要允许水平滚动,则需要在水平方向上执行相同的常规操作.


更新:

还有另一种方法.在文档视图中配置约束以赋予其严格的大小(无不等式).这通常是从顶部到顶部子视图的约束链,从子视图的底部到另一个子视图的顶部等,以及从底部子视图的底部到文档视图的底部.同样导致尾随.

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

如果您在此配置中进行测试,则可以调整大小并滚动滚动视图.所以,这很好.但是,当滚动视图的内容区域高于文档视图时,文档视图将固定到内容区域的底部.在这种情况下,你通常希望它固定在顶部.

原因是剪辑视图未翻转.此外,它正在调整其边界以匹配文档视图.因此,即使存在将文档视图固定到剪辑视图顶部的约束,剪辑视图的顶部也不是您期望的位置.剪辑视图将文档视图放在(0,0),它位于底部.

因此,最后一部分是创建一个返回的NSClipView覆盖的子类.然后,将NIB中剪辑视图的类设置为子类.在那之后,它将按你的意愿工作.-isFlippedYES


scu*_*cum 5

基于 Ken Thomases 的答案,使用 Swift 4,可以将flipped用户定义的属性添加到 NSClipView,以将内容固定到滚动视图的顶部。

翻转属性