带有子视图的自动布局 NSCollectionView
Posted
技术标签:
【中文标题】带有子视图的自动布局 NSCollectionView【英文标题】:Autolayout NSCollectionView with subviews 【发布时间】:2014-07-08 01:00:48 【问题描述】:我在一个 .xib 中有一个 NSCollectionView 和 另一个 .xib 中该集合视图的子视图集合视图项
我正在尝试向我的集合视图项添加约束,以便 让它来
-
将边缘与超级视图的视图对齐
根据超级视图调整自身大小
第二个 .xib 中的集合视图项是一个带有约束的 NSTableView,如附件所示。
启动时我得到以下信息
-
父视图,即 NSCollectionView 大于其子视图。
如果我调整整个窗口的大小并使其更小,NSCollectionView 也会自行调整大小,但子视图不会。见第二个附件。
【问题讨论】:
项目通常将它们的大小提供给集合视图,然后集合视图将它们布置在网格中。让项目尝试使自己符合集合视图提供的大小没有多大意义。集合视图如何选择尺寸?也就是说,您可以在集合视图上设置最小和最大项目大小。 我明白了。可以用 NSScrollView 来实现吗?我知道 NSCollectionView 嵌入在 NSScrollView 中 实现什么?您希望如何确定集合视图中项目的大小?你可以把它们做成你想要的任何尺寸。NSCollectionView
不会做你想做的事。鉴于相当简单的单行布局,您可以使用NSStackView
。您将负责为每个表示的对象添加一个视图,但堆栈视图会将它们水平放置。在垂直方向上,您可以在包含视图的边缘和堆栈视图的边缘之间设置约束。
滚动视图除了为比它更大的内容视图提供滚动外,不会做任何事情。您可以通过创建一个普通的NSView
作为容器,然后用子视图填充它,从而在道德上等同于堆栈视图。设置布局约束以保持子视图在其中按您喜欢的方式排列,并保持普通视图足够宽以包含它们。将普通视图设置为与剪辑视图一样高,将子视图设置为与视图一样高。确保子视图的高度至少相对于视图到剪辑视图约束的优先级是灵活的。
【参考方案1】:
NSCollectionView
不会做你想做的事。这些项目将它们的大小提供给集合视图,然后集合视图将它们布置在网格中。
鉴于您尝试实现的相当简单的单行布局,您可以使用NSStackView
。如果您不想要求 10.9 或更高版本,您可以通过创建一个普通的 NSView 作为您的容器,然后用子视图填充它,从而在道德上等同于堆栈视图。您可以将此视图放入滚动视图中。容器视图将具有保持其顶部和底部等于剪辑视图的约束。它的宽度与剪辑视图的宽度无关。 (我不知道您是否希望将容器视图的前沿与剪辑视图绑定。这可能需要一些实验。)
设置布局约束以使子视图在容器视图中按您喜欢的方式排列,并保持其足够宽以容纳所有子视图。您需要约束来保持子视图的顶部与容器视图的顶部相关,并且与底部类似。但是,请确保子视图的高度至少相对于视图到剪辑视图约束的优先级是灵活的。
【讨论】:
【参考方案2】:我已经能够通过在视图控制器中调用 viewWillLayout
中的 collectionView.collectionViewLayout?.invalidateLayout()
来处理调整大小时将 itemSize 设置为 FlowLayoutDelegate 中的集合视图的宽度来实现您使用 NSCollectionView 描述的内容。
【讨论】:
以上是关于带有子视图的自动布局 NSCollectionView的主要内容,如果未能解决你的问题,请参考以下文章