我在使用自动布局滚动视图调整垂直窗口大小时遇到问题。
我想要的是
我想尽可能地复制我的应用程序当前的窗口大小调整行为。窗口的宽度是灵活的,但窗口的高度通常应跟踪内容的高度。具体来说:
- 通常,窗口会自动调整其高度以精确调整
匹配其内容(#2 除外)。
- 用户可以选择手动调整窗口大小,使其小于其实际大小
内容,在这种情况下,嵌入的滚动视图将滚动
内容。一旦变短,窗口就会保持该高度,直到手动
调整大小或内容再次变得等于或小于窗口。
- 如果内容增长到窗口底部
碰撞到停靠栏或屏幕边界,窗口的高度被固定
到那个高度,就像用户调整了它的大小一样。
我有什么
我创建了一个带有一组代表性子视图的窗口,这些子视图模仿了我的应用程序的基本需求。窗口的层次结构很简单:
Window
NSView (contentView)
NSScrollView
NSClipView (NSScrollView.contentView)
NSView (NSScrollView.documentView)
A bunch of standard and custom subviews with constraints
您可以在此处下载测试项目(macOS 10.12/Xcode 8):http://mbx.cm/t/4FUGY http://mbx.cm/t/4FUGY
我组织了各种子视图,使它们具有灵活的宽度,但约束恰好定义了一种可能的高度。父滚动视图填充窗口的内容视图。
自动布局的东西效果很好。窗口会自动调整大小以匹配内容的大小。如果内容的高度发生变化,窗口的高度也会发生变化以匹配。惊人的。
我无法去上班的事情
我没有运气让 NSWindow 让我手动调整其高度。调整大小指示器(将鼠标悬停在边缘上时)显示我可以更改窗口的宽度,但不能更改其高度。
我最初想“哦,这一定是滚动视图之一中的压缩阻力优先级。”但我找不到抗压性或拥抱优先级的组合来改变这种行为。我尝试过设置滚动视图本身和文档视图的优先级(这对我来说没有意义,但我还是尝试了)。我尝试了我能想到的每一种组合值 749、499、49 和 1。
我搜索了似乎已发布的每个问题,但大多数发布的问题似乎都在解决不同的问题。
我添加了一个“转储”按钮来记录垂直约束。列出的所有内容似乎都符合预期,除了少数我不理解的 NSAutoresizingMaskLayoutConstraint 对象。但是,这些似乎是文档视图和剪辑视图之间的约束,因此我假设它们是自动创建的并且不是问题的一部分。
<NSLayoutConstraint:0x608000082580 PartBoxView:0x608000140840'Part B'.height == 96 (active)>
<NSLayoutConstraint:0x608000083de0 V:[PartBoxView:0x608000140840'Part B']-(0)-| (active, names: '|':NSView:0x6080001212c0 )>
<NSLayoutConstraint:0x608000083e80 V:[PartBoxView:0x608000140370'Part A']-(NSSpace(8))-[PartBoxView:0x608000140840'Part B'] (active)>
<NSLayoutConstraint:0x608000082da0 V:|-(0)-[NSScrollView:0x6080001c10e0] (active, names: '|':NSView:0x608000121400 )>
<NSLayoutConstraint:0x608000083430 V:|-(0)-[NSView:0x6080001212c0] (active, names: '|':NSClipView:0x10040e2a0 )>
<NSLayoutConstraint:0x608000081e00 V:[NSScrollView:0x6080001c10e0]-(0)-| (active, names: '|':NSView:0x608000121400 )>
<NSAutoresizingMaskLayoutConstraint:0x650000082b20 h=-&- v=-&- NSView:0x608000121400.minY == 0 (active, names: '|':NSThemeFrame:0x102504ea0'Window' )>
<NSAutoresizingMaskLayoutConstraint:0x6500000823f0 h=-&- v=-&- NSClipView:0x10040e2a0.minY == 1 (active, names: '|':NSScrollView:0x6080001c10e0 )>
<NSLayoutConstraint:0x608000083480 V:[NSView:0x6080001212c0]-(0)-| (active, names: '|':NSClipView:0x10040e2a0 )>
<NSAutoresizingMaskLayoutConstraint:0x650000082440 h=-&- v=-&- V:[NSClipView:0x10040e2a0]-(1)-| (active, names: '|':NSScrollView:0x6080001c10e0 )>
<NSLayoutConstraint:0x608000083d40 V:|-(0)-[PartBoxView:0x608000140370'Part A'] (active, names: '|':NSView:0x6080001212c0 )>
<NSLayoutConstraint:0x608000083c50 V:[NSImageView:0x608000161bc0]-(20)-| (active, names: '|':PartBoxView:0x608000140370'Part A' )>
<NSLayoutConstraint:0x608000083bb0 V:|-(20)-[NSImageView:0x608000161bc0] (active, names: '|':PartBoxView:0x608000140370'Part A' )>
<NSLayoutConstraint:0x608000083660 NSImageView:0x608000161bc0.height == 64 (active)>
我希望有自动布局经验的人可以告诉我如何让#2 工作。我很确定#3 需要一些自定义代码,但#2 是最大的障碍。
的背景
我正在对我的应用程序进行重大改进。这是一个相当大的应用程序,因此我首先创建一组测试项目来测试一些新的 UI 和技术。
第一项重大任务是将所有内容转换为自动布局。大部分看起来都相当顺利,我期待着自动布局的众多好处中的一些。