Macos 在Interface Builder中启用NSScrollView以使用自动布局滚动其内容
我实现了一个自定义的Macos 在Interface Builder中启用NSScrollView以使用自动布局滚动其内容,macos,cocoa,interface-builder,autolayout,nsscrollview,Macos,Cocoa,Interface Builder,Autolayout,Nsscrollview,我实现了一个自定义的NSView,其中包含许多NSTextFields和其他NSViews。然后,我使用编辑器>嵌入>滚动视图将该自定义视图嵌入到滚动视图中。这将创建在大纲中可见的适当层次结构,但我需要添加自动布局约束,以指定此滚动视图在视图中的位置(顶部、底部、前导、尾随)。此外,我还必须为自定义视图添加约束(针对剪辑视图设置),以便在正确的位置布置元素。这很好,当我运行应用程序时,所有元素都会正确显示,视图也会滚动。但是,当我降低主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,
NSView
,其中包含许多NSTextField
s和其他NSView
s。然后,我使用编辑器>嵌入>滚动视图将该自定义视图嵌入到滚动视图中。这将创建在大纲中可见的适当层次结构,但我需要添加自动布局约束,以指定此滚动视图在视图中的位置(顶部、底部、前导、尾随)。此外,我还必须为自定义视图添加约束(针对剪辑视图设置),以便在正确的位置布置元素。这很好,当我运行应用程序时,所有元素都会正确显示,视图也会滚动。但是,当我降低主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,当我更新框架时,会再次增加视图的高度。为了解决这个问题,我必须删除滚动视图对主视图的底部约束。现在,当我运行应用程序时,窗口被设置为正确的大小,但我无法滚动自定义视图以到达内容的底部-它受到限制,因此除了弹性反弹效果之外,它根本不会滚动,因为您处于边缘限制。所以我的问题是,当我在XIB中布局所有元素并使用自动布局时,我必须做什么才能允许此滚动视图滚动?以下是一般方法:
- 使文档视图至少与剪辑视图一样高。或者,等效地,使剪辑视图不高于文档视图
- 允许文档视图的高度增加,但不能缩小到其子视图所需的范围之外
- 在其他约束条件下,使用低优先级约束使文档视图尽可能小,以防止文档视图中出现歧义
更新: 还有另一种方法。在文档视图中配置约束,使其具有严格的大小(没有不平等)。这通常是一个约束链,从其顶部到顶部子视图,从该子视图的底部到另一个子视图的顶部,等等,从底部子视图的底部到文档视图的底部。导致拖尾的情况也一样 然后,剪辑视图和文档视图之间唯一必要的约束是顶部约束和前导约束 如果在此配置中进行测试,您将能够调整大小,并且滚动视图将滚动。所以,这很好。但是,当滚动视图的内容区域高于文档视图时,文档视图将固定在内容区域的底部。在那种情况下,你通常希望它别在上面 原因是剪辑视图未翻转。此外,它正在调整其边界以匹配文档视图。因此,即使存在将文档视图固定到剪辑视图顶部的约束,剪辑视图的顶部也不是您期望的位置。剪辑视图将文档视图放置在底部的(0,0)
因此,最后一步是创建一个子类
NSClipView
,该子类覆盖-isfliped
以返回YES
。然后,将NIB中剪辑视图的类设置为您的子类。之后,它将按照您的要求运行。我将重新发布我的答案
查看2012年苹果开发者大会关于自动布局的视频,了解在代码中使用自动布局的信息
只需在Interface Builder或代码中使用我在本视频教程中记录的方法:
这是我在本视频中使用的方法:
基于Ken Thomases的答案,使用Swift 4,可以将
flipped
作为用户定义的属性添加到NSClipView,以将内容固定到scrollview的顶部
为了改进Ken的答案,我做了以下几点: •首先,我读了一篇关于如何使用自动布局在Interface Builder(IB)中设置NSScrollView的精彩文章 •然后我做了以下工作: •在IB中创建了一个
NSScrollView
实例
•创建了NSClipView
的新子类,并添加了以下内容
class ScCalendarClipView: NSClipView {
open override var isFlipped: Bool {
return true
}
}
// Right
First Item: SuperView.Trailing
Relation: Less Than or Equal
Second Item: DocumentView.Trailing
Constant: 0
Priority: 510
Multiplier: 1
First Item: SuperView.Trailing
Relation: Greater Than or Equal
Second Item: DocumentView.Trailing
Constant: 0
Priority: 490
Multiplier: 1
// Left
First Item: DocumentView.Leading
Relation: Equal
Second Item: SuperView.Leading
Constant: 0
Priority: 1000
Multiplier: 1
// Bottom (negative constants increase the size of the document view)
First Item: SuperView.Bottom
Relation: Less Than or Equal
Second Item: DocumentView.Bottom
Constant: -600
Priority: 510
Multiplier: 1
// Bottom (constant should be equal to the bottom constraint above)
First Item: SuperView.Bottom
Relation: Greater Than or Equal
Second Item: DocumentView.Bottom
Constant: -600
Priority: 490
Multiplier: 1
// Top
First Item: DocumentView.Top
Relation: Equal
Second Item: SuperView.Top
Constant: 0
Priority: 1000
Multiplier: 1