Ios UICollectionviewCell:计算完美单元格大小

Ios UICollectionviewCell:计算完美单元格大小,ios,uicollectionview,Ios,Uicollectionview,我有一个UICollectionView,其中填充了不同数量的单元格。 电池应尽可能完美地利用可用空间。为此,我计算每个单元的可用空间 视图初始化时应计算可用空间。每个单元格与所有单元格的间距为2pt。目前我已经用64pt硬编码导航栏和状态栏的空间,这不是未来的证明 使用下面的代码,所有东西都在模拟器中工作,但在真正的硬件(iPhone5s)上却不工作:在我的物理iPhone上,高度计算不正确,在最后一行和集合视图底部之间出现了大约30磅的间隙 你知道如何改进代码吗 private func c

我有一个UICollectionView,其中填充了不同数量的单元格。 电池应尽可能完美地利用可用空间。为此,我计算每个单元的可用空间

视图初始化时应计算可用空间。每个单元格与所有单元格的间距为2pt。目前我已经用64pt硬编码导航栏和状态栏的空间,这不是未来的证明

使用下面的代码,所有东西都在模拟器中工作,但在真正的硬件(iPhone5s)上却不工作:在我的物理iPhone上,高度计算不正确,在最后一行和集合视图底部之间出现了大约30磅的间隙

你知道如何改进代码吗

private func computeCellSizes(var size :CGSize){

        if(size == CGSizeZero){
            size = self.collectionView!.frame.size
        }

        self.numberOfRows  = Int(size.width / 103)

        //spacing of 2 points between each cell
        let availableWidth = size.width - CGFloat((self.numberOfRows + 1)  * 2)
        let cellWidth = availableWidth / CGFloat(numberOfRows)

        self.numberOfColumns = Int(size.height / (cellWidth * 1.3))
        //spacing of 2 points between each cell, minus navigationcontroller height
        let availableHeight = size.height - CGFloat((numberOfColumns + 1)  * 2) - 64
        let cellHeight = availableHeight / CGFloat(numberOfColumns)

        let cellSize =  CGSizeMake(cellWidth, cellHeight)

        self.cachedSizes.setObject(NSValue(CGSize: cellSize), forKey: size.width)
    }
我是这样做的 (在UICollectionViewController实现中):


在寻求代码方面的帮助时,请解释您所得到的是如何失败的。你的代码是如何在“真正的硬件”上失败的?谢谢你的评论-我添加了这个。这并没有回答我的问题,因为它忽略了不同的问题devices@netshark1000“它忽略不同的设备”是什么意思?您已获得view.frame大小并计算当前view.frame的最佳单元格大小。在方法
sizeFormiteIndeXPath
中写入此大小,一切都会好起来。
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(10, 10, 10, 10); //spacing on margins (top, left, bottom, right)
}

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake((self.view.frame.size.width - 40)/3, 100.0); // I show 3 cell for one row (-40 - spaces between cells and screen sides)
}