如何使用相对于容器大小的项目初始化 UICollectionViewController?

Posted

技术标签:

【中文标题】如何使用相对于容器大小的项目初始化 UICollectionViewController?【英文标题】:How do I initialize a UICollectionViewController with items that are sized relative to the container? 【发布时间】:2014-11-17 23:24:48 【问题描述】:

我正在尝试布局视图网格。每行应该有 3 个视图。我试图这样定义我的UICollectionViewController 的构造函数:

- (id)initWithDefaultLayout

    UICollectionViewFlowLayout* layout = [[UICollectionViewFlowLayout alloc] init];
    layout.scrollDirection = UICollectionViewScrollDirectionVertical;
    CGFloat dimension = floorf(self.view.frame.size.width / 3.0f);
    layout.itemSize = CGSizeMake(dimension, dimension);
    layout.minimumInteritemSpacing = 1.0f;
    layout.minimumLineSpacing = 1.0f;
    return [super initWithCollectionViewLayout:layout];

程序在访问 self.view 的行上崩溃了:

NSException found: UICollectionView 必须用非零初始化 布局参数

我想loadView 的内部实现看到UICollectionViewLayout 没有设置并抛出异常。

我将如何以干净的方式解决此问题?如果我对项目的宽度进行硬编码,代码会很脆弱,因为 ios 屏幕尺寸不同。此外,在某些情况下,此视图控制器以模态方式呈现(小于屏幕尺寸)。

【问题讨论】:

【参考方案1】:

为什么不覆盖 UICollectionViewDelegateFlowLayout protocol 的 sizeForItemAtIndexPath 方法 - collectionView:layout:sizeForItemAtIndexPath:

那么你只需提供如下内容:

- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath


    CGFloat viewWidth = CGRectGetWidth(self.view.bounds);

    int numCellsInRow = 3;

    // adjust for the spacing
    viewWidth -= ((numCellsInRow+1)*1.0f); 

    CGFloat dimension = viewWidth/(float)numCellsInRow;


    return CGSizeMake(dimension, dimension);

【讨论】:

是的。这使得编程类似于UITableView

以上是关于如何使用相对于容器大小的项目初始化 UICollectionViewController?的主要内容,如果未能解决你的问题,请参考以下文章

图像没有相对于父 div 正确调整自身大小

获取元素相对于父容器的位置/偏移量?

如何根据容器大小设置字体大小? [复制]

UIView 框架、边界和中心

可以将 SVG 剪辑路径相对于其容器居中吗?

Extjs4 常用布局总结