如何使用相对于容器大小的项目初始化 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?的主要内容,如果未能解决你的问题,请参考以下文章