如何在屏幕显示之前获取 UICollectionView 中的单元格框架?

How do I get the frames of cells in a UICollectionView before the screen has been presented?

在将 UICollectionViewController 的集合视图推送到导航堆栈之前获取前 3 个单元格位置的最佳方法是什么?

例如:

let collectionViewController = SomeCollectionViewControllerSubclass(data: someData)
// @ TODO: get the frames of the first three cells here so I can create a fancy transition
self.navigationController.pushViewController(collectionViewController, animated: true)

这是我尝试过的:

let collectionViewController = SomeCollectionViewControllerSubclass(data: someData)

// force load the view
let view = collectionViewController.view

// try to get a cell directly (result: nil)
println(collectionViewController.collectionView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)

// try to ask the layout for the cell attributes (result: CGRectZero)
println(collectionViewController.collectionView.collectionViewLayout.initialLayoutAttributesForAppearingItemAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)))

self.navigationController.pushViewController(collectionViewController, animated: true)

有能力的就得自己算了。

您无法在单元格视图显示在屏幕上之前访问它们,因为它们会在系统需要显示它们时创建,以避免在不需要时创建它们。

因此,您必须依靠您的单元格布局知识来了解您是否可以评估它们的位置(例如,您的单元格是否始终具有相同的高度)。