Актуализация на оформлението на 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