OSXv10.11的AppKit发行说明建议可以根据每项调整集合视图项的大小:
可以全局确定集合视图的所有项的项目大小(通过设置NSCollectionViewFlowLayout的“itemSize”属性),也可以通过在集合视图的委托上实现itemSize来更改项目大小。
在我的例子中,我的CollectionViewItem由一个包含不同长度字符串的标签组成。我使用NSCollectionView来显示字符串数组,因为NSStackViews不支持数组绑定,也不支持新行。字符串数组通过数组控制器绑定到NSCollectionView的内容。
我的项目的nib文件被正确设置,根视图和标签都有1000的内容拥抱和内容压缩抵抗优先级,边缘是通过AutoLayout对齐的。
现在,NSCollectionViewLayout的委托方法具有以下签名:
func collectionView(collectionView: NSCollectionView,
layout collectionViewLayout: NSCollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize我现在的想法是抓取项目本身,运行一个布局传递给它,然后返回新的项目大小。
let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size这种方法的问题是itemAtIndexPath返回零。如果在零情况下返回默认大小,则对所有单元格都使用默认大小。
如何设置NSCollectionView以遵守项目的AutoLayout约束,并对每个单元格动态使用计算的大小?
发布于 2018-01-26 22:41:57
有一个重复的问题,我回答了,但这可能是一个应该针对的,因为它是旧的。
尤尔的评论是正确的-项目不存在。被调用的sizeForItemAt是一个集合,它要求委托为该数据条目提供任何特定的大小,它将使用该数据条目来帮助创建其最终的视图控制器NSCollectionViewItem。因此,当您要求集合在用于帮助获取项的方法中获取项时,您将创建一个循环。
我们面临的问题是,我们希望根据数据的外观进行大小调整:具有适当格式的文本标签的长度,而不仅仅是字符串长度。所以我们遇到了鸡和蛋的问题。
我想出的唯一解决办法是:
准备
NSCollectionViewItem,并确保集合视图具有返回正确子类项的数据源。sizeForItemAt调用之前的某个时候,或者在第一个调用的开始时,如果到那时还没有,则手动创建NSCollectionViewItem子类的实例,并使用NSNib的instantiate(withOwner:topLevelObjects:)作为所有者使用子类实例化它的XIB。将该引用存储为某种“调整大小的模板”,因此您只需要执行一次。代表对我来说是最容易的地方。^注意:我的第一条路线是通过集合的makeItemWithIdentifier__尝试这一点,但是它更脆弱,因为它要求集合在创建大小模板时有项。在初始sizeForItemAt (在重新加载崩溃期间访问/制作项)时,也无法完成此操作。我担心,因为它是用集合制作的,它可能会被重复使用,下面的方法不起作用,或者开始编辑可见的项目。YMMV
在sizeForItemAt中
View.FittingSize,一个项目的最小大小可以被赋予它的约束/优先级,并返回它。哈哈!没有经过压力测试或任何事情,但在我的一端没有问题,它没有做布局传递或任何事情,只是调用FittingSize。我还没有在网上看到过这篇文章,所以我想把完整的解释写出来。
我是在Xamarin.Mac中这样做的,所以我的代码不会是1:1,我不想写乱七八糟的东西。
TLDR:手动实例化一个NSCollectionViewItem子类及其将存储的xib,该子类不属于集合。在sizeForItem填充该项期间,将其存储为大小调整引用,并返回集合项视图的FittingSize。
https://stackoverflow.com/questions/33460374
复制相似问题