使`NSScrollView`足够大以适应文档视图但不会太大会使窗口溢出屏幕

时间:2018-03-02 06:58:20

标签: swift cocoa autolayout

问题

这是我正在开发的一个开源Cocoa框架的问题EasyDialogs

目标是以编程方式在窗口内显示一个表单(一组控件),并自动将窗口大小调整为“明智的”#34;大小永远不会超过屏幕。

但是,在打开表单窗口(FormWindow)时,窗口的大小与表单中控件的大小不匹配,需要由用户手动调整大小。

预期行为

窗口(FormWindow)的所需行为是窗口扩展到足以包含表单控件的大小(显示所有控件所需的最小大小),除非这将使窗口大于屏幕。在这种情况下,窗口应受屏幕大小的限制,窗体控件将被剪裁(在滚动视图内)。

如何重现

  1. 查看fix/form-window-resizing分支
  2. 运行carthage bootstrap --platform osx
  3. 打开XCode并运行EasyDialogExample架构
  4. 该应用程序将打开一个显示窗口,其中包含一个按钮,用于"大"或"小"形成。试试两个。
  5. 详细

    FormWindow中的窗口由三部分组成:

    三个部分constrained按顺序排列在彼此之上,填满整个窗口。出于此问题的目的,相关部分是堆栈。

    堆栈是NSStackView内的NSScrollViewNSStackView包含表单控件。所需的行为是滚动视图将增长到适应堆栈所需的最小尺寸而没有剪裁,除非这会使整个窗口大于屏幕,即窗口的顶部(或底部)远离屏幕,用鼠标无法到达。

    如果发生这种情况,NSScrollView应该剪切堆栈视图,这样窗口就像屏幕一样大但不会超出它,用户可以滚动访问整个堆栈

    尝试解决方案

    设置滚动尺寸min和max

    scroll.height <= stack.height scroll.height >= 300

    为什么它不起作用:滚动大小始终是最小的。我需要在显示窗口后手动调整窗口大小。

    将滚动大小设置为堆栈大小

    scroll.height == stack.height

    为什么它不起作用:窗口总是与显示表单所需的一样大。只要堆栈加上窗口的其余部分小于屏幕,这就可以工作。但是它会使窗口大于屏幕。

    修改滚动视图intrinsicContentSize

    我将NSStackView子类化为返回内部内容大小,该大小等于documentView的大小。但是,在执行布局之前会访问内在大小属性,因此当时子视图的内在内容大小为(-1,-1)

0 个答案:

没有答案