首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10.11 NSCollectionView -动态确定单元大小

10.11 NSCollectionView -动态确定单元大小
EN

Stack Overflow用户
提问于 2015-11-01 08:19:05
回答 1查看 3.7K关注 0票数 10

OSXv10.11的AppKit发行说明建议可以根据每项调整集合视图项的大小:

可以全局确定集合视图的所有项的项目大小(通过设置NSCollectionViewFlowLayout的“itemSize”属性),也可以通过在集合视图的委托上实现itemSize来更改项目大小。

在我的例子中,我的CollectionViewItem由一个包含不同长度字符串的标签组成。我使用NSCollectionView来显示字符串数组,因为NSStackViews不支持数组绑定,也不支持新行。字符串数组通过数组控制器绑定到NSCollectionView的内容。

我的项目的nib文件被正确设置,根视图和标签都有1000的内容拥抱和内容压缩抵抗优先级,边缘是通过AutoLayout对齐的。

现在,NSCollectionViewLayout的委托方法具有以下签名:

代码语言:javascript
复制
func collectionView(collectionView: NSCollectionView, 
                    layout collectionViewLayout: NSCollectionViewLayout, 
                    sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize

我现在的想法是抓取项目本身,运行一个布局传递给它,然后返回新的项目大小。

代码语言:javascript
复制
let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size

这种方法的问题是itemAtIndexPath返回零。如果在零情况下返回默认大小,则对所有单元格都使用默认大小。

如何设置NSCollectionView以遵守项目的AutoLayout约束,并对每个单元格动态使用计算的大小?

EN

回答 1

Stack Overflow用户

发布于 2018-01-26 22:41:57

有一个重复的问题,我回答了,但这可能是一个应该针对的,因为它是旧的。

尤尔的评论是正确的-项目不存在。被调用的sizeForItemAt是一个集合,它要求委托为该数据条目提供任何特定的大小,它将使用该数据条目来帮助创建其最终的视图控制器NSCollectionViewItem。因此,当您要求集合在用于帮助获取项的方法中获取项时,您将创建一个循环。

我们面临的问题是,我们希望根据数据的外观进行大小调整:具有适当格式的文本标签的长度,而不仅仅是字符串长度。所以我们遇到了鸡和蛋的问题。

我想出的唯一解决办法是:

准备

  • 子类NSCollectionViewItem,并确保集合视图具有返回正确子类项的数据源。
  • 完全在XIB中使用约束。
  • 您的子类应该有一个加载要表示的数据对象的方法--这也包括您的数据源协议方法。
  • 在第一个sizeForItemAt调用之前的某个时候,或者在第一个调用的开始时,如果到那时还没有,则手动创建NSCollectionViewItem子类的实例,并使用NSNib的instantiate(withOwner:topLevelObjects:)作为所有者使用子类实例化它的XIB。将该引用存储为某种“调整大小的模板”,因此您只需要执行一次。代表对我来说是最容易的地方。

^注意:我的第一条路线是通过集合的makeItemWithIdentifier__尝试这一点,但是它更脆弱,因为它要求集合在创建大小模板时有项。在初始sizeForItemAt (在重新加载崩溃期间访问/制作项)时,也无法完成此操作。我担心,因为它是用集合制作的,它可能会被重复使用,下面的方法不起作用,或者开始编辑可见的项目。YMMV

sizeForItemAt

  • 直接从数据源获取表示的数据对象。让您的调整大小模板对象使用我前面提到的方法表示该数据对象。
  • 访问大小模板的View.FittingSize,一个项目的最小大小可以被赋予它的约束/优先级,并返回它。

哈哈!没有经过压力测试或任何事情,但在我的一端没有问题,它没有做布局传递或任何事情,只是调用FittingSize。我还没有在网上看到过这篇文章,所以我想把完整的解释写出来。

我是在Xamarin.Mac中这样做的,所以我的代码不会是1:1,我不想写乱七八糟的东西。

TLDR:手动实例化一个NSCollectionViewItem子类及其将存储的xib,该子类不属于集合。在sizeForItem填充该项期间,将其存储为大小调整引用,并返回集合项视图的FittingSize

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33460374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档