尽管有限制,NSStackView 仍为集合视图提供了太多空间

问题描述 投票:0回答:1

我有一个包含 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 配置。我添加到模板项目的唯一代码是向集合视图提供项目。

swift macos cocoa autolayout nsstackview
1个回答
0
投票

一个值得一试的选择...

为您的滚动视图添加

@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

© www.soinside.com 2019 - 2024. All rights reserved.