我有一个包含 NSImageView 和 NSCollectionView 的 NSStackView。这两个项目都包装在自己的 NSScrollView 中:
期望的行为
我希望集合视图仅占用其项目所需的垂直空间。如果它没有项目,它的高度应该是 24px。如果它的项目需要多行,它应该显示到 2.5,没有滚动条,然后滚动。
我希望图像视图占据窗口中的其余空间(除了“添加”和“删除”按钮)。图像视图总会有一些内容。如果图像的大小小于可用空间,我只希望图像最初以其固有大小显示在滚动视图的中心。我已将滚动视图设置为允许放大,因此用户可以根据需要调整图像大小。
窗口在垂直方向上永远不会小于~300px,因此两个视图都应该始终可见。
观察到的行为
水平方向一切都很好,只是垂直方向出现问题。
问题是集合视图几乎总是处于最大高度,即使它只有 0 或 1 行项目。
自动布局配置
堆栈视图的拥抱优先级对于两者来说都是默认的250。图像视图及其滚动视图都有 249 个。我尝试过将其设置为 1,但它没有改变任何东西。
集合视图的滚动视图在两个方向上的拥抱优先级均为 250。这是默认值,但即使将其设置为 1000 也不会改变行为。
我最初看到图像视图永远不会超出其固有内容高度,并将所有剩余空间提供给集合视图。但后来我加了一个“高度<= 60" constraint to the collection view's scroll view. Now things are better, but the collection view is still not shrinking to a single line when it doesn't need more vertical space. Really, I think the <= constraint is either the wrong solution or only a partial one.
您可以在此 GitHub 存储库 找到所有相关代码。大多数情况下,它是 IB 配置。我添加到模板项目的唯一代码是向集合视图提供项目。
一个值得一试的选择...
为您的滚动视图添加
@IBOutlet
连接:
@IBOutlet weak var scrollView: NSScrollView!
然后,在
viewDidLoad()
:
override func viewDidLoad() {
super.viewDidLoad()
let c = scrollView.heightAnchor.constraint(equalTo: collectionView.heightAnchor, multiplier: 1.0)
c.priority = .required - 1
c.isActive = true
}
当您调整窗口大小并添加/删除项目时,滚动视图高度将自动调整。
但是...启动时滚动视图高度将不正确。
我使用 iOS,并且不熟悉视图/控制器生命周期,因此在某些时候您需要强制执行另一个布局过程。
或者...您可能想看看不使用集合视图。这是一种方法(iOS,但转换到 MacOS 应该不难):https://stackoverflow.com/a/60588546/6257435