Как сделать UICollectionViewFlowLayout itemSize динамическим для размера экрана
Я работаю программно (без раскадровки), и у меня возникают проблемы с компоновкой layout.itemSize для разных размеров экрана. Я получаю это сообщение об ошибке:
"UICollectionView должен быть инициализирован параметром макета не-nil"
со следующим кодом в моем файле реализации:
- (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]);
}
Я не получаю сообщение об ошибке, если я использую "100 100", например, для layout.itemSize
. Есть ли способ сделать его динамичным?
Я новичок в Objective-C, поэтому буду признателен за любую помощь в том, что я делаю неправильно.
Ответы
Ответ 1
Необходимо использовать метод делегата потока:
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize cellSize = CGSizeMake(width, height);
return cellSize;
}
Вы указываете значения float по ширине и высоте для того, что вы хотите.
Например, скажем, что ваш 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;
}
Ответ 2
добавьте следующий метод делегата в представление коллекции
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *image;
long row = [indexPath row];
image = [UIImage imageNamed:_carImages[row]];
return image.size;
}
здесь ссылка, которая поможет вам ввести описание ссылки здесь