5

我正在为 UICollectionView 中的单元格大小而苦苦挣扎。在 android 中,您可以轻松地“包装”单元格的大小。就像在 iOS 中一样,您有一个名为“GetCell”的函数,您可以决定它有多大。

iOS 的不同之处在于,在(UICollectionViewController 的)“getCell”函数中,您似乎无法选择单元格(或内容视图)的大小。如果我更改大小,它将忽略它并使用 CollectionView 的一般“ItemSize”(所有单元格都相同)。

这有时会导致视图不是很漂亮。例如,如果我有一个包含图像的水平列表,我希望图像之间的距离相同,如果一个图像是 200x200 而另一个是 400x200,则独立。所以单元格大小也应该不同。

可以为不同的单元格定义不同的大小。您可以使用 Collectionview 委托和 GetSizeForItem(= ObjC 中的 sizeForItemAtIndexPath)函数。问题是,这个函数是在实际的 GetCell 函数之前调用的。

因此,如果我有一个更复杂的单元格,例如一些标签。在我的“GetCell”函数中,我构建了这个 Cell,最后,当返回 Cell 时,我知道它应该是什么大小。但是,在 GetSizeForItem 函数中,该信息尚不可用,因为 Cell 仍为“空”。

我能做到的唯一方法是在调用“GetSizeForItem”时为单元格实际构建 UIView(以便我可以请求大小)。但这似乎不是一个好的设计,因为我在“GetCell”之前构建 UIView,我将在其中再次构建它。

有什么我忽略的吗?

问候, 马特

4

1 回答 1

10

事实上,GetSizeForItem 与 GetCell 是分开调用的。这样做是因为创建 UIViews 是一项非常耗时和消耗内存的任务,并且您的应用程序要么内存不足,要么必须处理其他视图才能处理大列表。

在呈现视图之前,UICollectionView(和 UITableView)会询问列表中所有(或大多数)元素的大小和位置,因此它可以知道在哪里绘制它们。但是其中许多元素将不可见,因此 collectionView 避免了创建它们。这就是为什么 GetSizeForItem 被预先调用,而 GetCell 只是在以后被调用的原因。

在您的情况下,尝试将计算视图大小的逻辑与视图本身分开。使它成为一个简单的数学公式,不需要视图存在,因此它足够快,可以预先运行。

于 2012-11-25T21:44:39.043 回答