具有可变单元大小的UICollectionView

时间:2012-11-23 15:30:07

标签: ios xamarin.ios ios6 uicollectionview uicollectionviewcell

我正在为UICollectionView中的单元格大小努力。 在android中,您可以轻松地“包装”单元格的大小。 就像在iOS中一样,你有一个函数调用'GetCell',你决定它会有多大。

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

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

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

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

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

我有什么东西可以忽略吗?

此致 马特

1 个答案:

答案 0 :(得分:10)

确实GetSizeForItem与GetCell分开调用。这样做是因为创建UIViews是一个非常耗费时间和内存的任务,你的应用程序要么内存不足,要么必须处理其他视图以便能够处理大列表。

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

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