我以编程方式工作(没有故事板),并且无法使layout.itemSize动态化为不同的屏幕尺寸.我收到这个错误消息:
“UICollectionView must be initialised with a non-nil layout parameter”
- (instancetype)init { UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; CGSize size = self.collectionView.bounds.size; layout.itemSize = CGSizeMake(size.width,size.height); [layout setScrollDirection:UICollectionViewScrollDirectionVertical]; layout.minimumLineSpacing = 100.0; layout.headerReferenceSize = CGSizeMake(0.0,50.0); return (self = [super initWithCollectionViewLayout:layout]); }
如果我对layout.itemSize使用“100,100”,我不会收到错误消息.有没有办法让它动态?
我是Objective-C的新手,所以我会很乐意为我做错事而提供任何帮助.
解决方法
需要使用流代理方法:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGSize cellSize = CGSizeMake(width,height); return cellSize; }
您可以指定任何所需的宽度和高度浮点值.
例如,让我们说你的CollectionView是垂直的,你想要一个简短的标题视图,一个大的中间视图和一个小的页脚视图,那么你可以做一些像:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGSize cellSize; cellSize.width = self.view.bounds.size.width; if(indexPath.row == 0) { // header view height cellSize.height = 100; } else if(indexPath.row == 1) { // body view height cellSize.height = 500; } else { // assuming number of items is 3,then footer view is last view // footer view height cellSize.height = 100; } return cellSize; }