Как сделать 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;
 }

здесь ссылка, которая поможет вам ввести описание ссылки здесь