这是我正在开发的一个开源Cocoa框架的问题EasyDialogs。
目标是以编程方式在窗口内显示一个表单(一组控件),并自动将窗口大小调整为“明智的”#34;大小永远不会超过屏幕。
但是,在打开表单窗口(FormWindow
)时,窗口的大小与表单中控件的大小不匹配,需要由用户手动调整大小。
窗口(FormWindow
)的所需行为是窗口扩展到足以包含表单控件的大小(显示所有控件所需的最小大小),除非这将使窗口大于屏幕。在这种情况下,窗口应受屏幕大小的限制,窗体控件将被剪裁(在滚动视图内)。
carthage bootstrap --platform osx
EasyDialogExample
架构 FormWindow
中的窗口由三部分组成:
三个部分constrained按顺序排列在彼此之上,填满整个窗口。出于此问题的目的,相关部分是堆栈。
堆栈是NSStackView
内的NSScrollView
。 NSStackView
包含表单控件。所需的行为是滚动视图将增长到适应堆栈所需的最小尺寸而没有剪裁,除非这会使整个窗口大于屏幕,即窗口的顶部(或底部)远离屏幕,用鼠标无法到达。
如果发生这种情况,NSScrollView
应该剪切堆栈视图,这样窗口就像屏幕一样大但不会超出它,用户可以滚动访问整个堆栈
scroll.height <= stack.height
scroll.height >= 300
为什么它不起作用:滚动大小始终是最小的。我需要在显示窗口后手动调整窗口大小。
scroll.height == stack.height
为什么它不起作用:窗口总是与显示表单所需的一样大。只要堆栈加上窗口的其余部分小于屏幕,这就可以工作。但是它会使窗口大于屏幕。
intrinsicContentSize
我将NSStackView
子类化为返回内部内容大小,该大小等于documentView
的大小。但是,在执行布局之前会访问内在大小属性,因此当时子视图的内在内容大小为(-1,-1)
。