Обновление макета UICollectionView - размер элемента не меняется

У меня проблема с размером элемента collectionView. Я хочу отображать 3 элемента подряд для портретного режима и 6 для альбомного. Я настроил -layoutSubviews следующим образом:

- (void)layoutSubviews {
    [super layoutSubviews];

    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) {
        //Portrait orientation
        self.flowLayoutPortrait.itemSize = CGSizeMake(106, 106);

    } else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) {
        //Landscape orientation
        self.flowLayoutPortrait.itemSize = CGSizeMake(93, 93);
    }
    [self.collectionView.collectionViewLayout invalidateLayout];
}

Но размер ячейки не обновляется, он всегда остается одинаковым для обеих ориентаций. Если я создам 2 flowLayouts и использую:

[self.collectionView setCollectionViewLayout:self.flowLayoutLandscape];

Все работает, но мне очень не нравится, как они меняются. Анимация действительно плохая. И поскольку itemSize — это единственное свойство, которое необходимо обновить, использование 1 макета кажется лучшим вариантом.

Как я могу сообщить collectionView об обновлении макета?


person Armands L.    schedule 19.05.2014    source источник


Ответы (2)


Я использовал этот метод, и это было для меня очень хорошо:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (_isLandscape)
        return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight);
    else
        return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight);
}
person Nazariy Vlizlo    schedule 19.05.2014
comment
Спасибо, это отлично работает! Для будущих читателей также необходимо добавить [collectionView.collectionViewLayout invalidateLayout] в willRotateToInterfaceOrientation: - person Armands L.; 19.05.2014

Может быть, вы можете использовать другую ячейку для портретного/ландшафтного режима с разными идентификаторами ... тогда вам просто нужно перезагрузить данные для просмотра коллекции, и это определенно сработает.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) {
        //Portrait orientation
        //dequeue cell for portrait mode

    } else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) {
        //Landscape orientation
        //dequeue cell for landscape mode
    }

    return cell;
}
person ShujatAli    schedule 19.05.2014