UICollectionView отображает разные ячейки в зависимости от ориентации

Я хочу установить ширину UICollectionViewCell в зависимости от ширины экрана. Когда он в портретном режиме, я хочу показать 3 ячейки, а если в альбомной ориентации, я хочу показать 4 ячейки.

Я также хочу иметь некоторые отступы между ячейками, но этот код ниже мне не помогает:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(20, 20, 0, 20);
}

Я предположил, что он должен добавить отступы вверху, слева и справа от ячейки.

Если я вижу портретный режим, то:

***cell*** *padding* ***cell*** *padding* ***cell***

Если пейзаж:

 ***cell*** *padding* ***cell*** *padding* ***cell*** *padding* ***cell***

Таким образом, отступы должны быть каждый раз одного размера для разной ориентации.

Допустим, это должно быть 20pt

Также я хочу добавить отступ 20 pt над каждой ячейкой.

Должен ли я написать какой-нибудь собственный макет потока?


person Matrosov Alexander    schedule 05.05.2015    source источник


Ответы (2)


Для Свифт 3:

  1. создайте @IBOutlet с вашим UICollectionView (мой называется picCollectionView)
  2. поместите этот код в свой viewDidLoad

    override func viewDidLoad() {
    super.viewDidLoad()
    
    let itemSize = UIScreen.main.bounds.width/3 - 2
    
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: itemSize, height: itemSize)
    layout.minimumInteritemSpacing = 2
    layout.minimumLineSpacing = 2
    
    picCollectionView.collectionViewLayout = layout
    

    }

  3. количество столбцов будет автоматически меняться в зависимости от ориентации устройства

  4. вы можете настроить заполнение, изменив MinimumInteritemSpacing и MinimumLineSpacing

Надеюсь это поможет!

person Maddie    schedule 09.08.2017

Вы должны аннулировать макет при изменении класса ориентации/размера:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];

    if (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass) {
        [self.collectionView.collectionViewLayout invalidateLayout];
    }
}

Затем соответствующим образом измените значение, которое вы возвращаете в collectionView:layout:insetForSectionAtIndex: (здесь я выбрал случайные значения):

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
        return UIEdgeInsetsMake(20, 20, 0, 20);
    } else {
        return UIEdgeInsetsMake(40, 40, 0, 40);
    }
}
person jszumski    schedule 05.05.2015
comment
да, но проблема в том, что у меня слишком много интервалов между ячейками по горизонтали, я хотел бы, например, чтобы каждый раз интервал между ячейками был одинакового размера, скажем, 20 pt, поэтому, даже если я поворачиваю экран, я просто должен увеличить размер ячейки на один ряд из примера с 3 клетки на 4 клетки. поэтому отступы, которые я отображал каждый раз, должны быть одинаковыми. Мне просто нужно растянуть клетки. - person Matrosov Alexander; 06.05.2015