it-swarm.com.ru

Изменить размер UICollectionViewCell на разных ориентациях устройства

Я использую UICollectionView с UICollectionViewFlowLayout.

Я устанавливаю размер каждой ячейки через

collectionView:layout:sizeForItemAtIndexPath:

При переключении с книжного на альбомный я бы хотел настроить размер каждой ячейки, чтобы он полностью соответствовал размеру CollectionView, не оставляя отступов между ячейками.

Вопросы:

1) Как изменить размер ячейки после события вращения?

2) А еще лучше, как сделать так, чтобы ячейки всегда умещались на весь размер экрана?

99
Fmessina

1) Вы можете поддерживать и заменять несколько объектов макета, но есть более простой способ. Просто добавьте следующее в свой подкласс UICollectionViewController и отрегулируйте размеры по мере необходимости:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{    
    // Adjust cell size for orientation
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
        return CGSizeMake(170.f, 170.f);
    }
    return CGSizeMake(192.f, 192.f);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.collectionView performBatchUpdates:nil completion:nil];
}

Вызов -performBatchUpdates:completion: сделает недействительным макет и изменит размер ячеек с анимацией (вы можете просто передать nil обоим параметрам блока, если у вас нет дополнительных настроек для выполнения).

2) Вместо жесткого кодирования размеров элементов в -collectionView:layout:sizeForItemAtIndexPath, просто разделите высоту или ширину границ collectionView на количество ячеек, которые вы хотите разместить на экране. Используйте высоту, если ваш collectionView прокручивает по горизонтали или ширину, если она прокручивает по вертикали.

200
followben

Если вам не нужны дополнительные анимации, созданные performBatchUpdates:completion:, просто используйте invalidateLayout, чтобы принудительно перезагрузить collectionViewLayout.

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [self.collectionView.collectionViewLayout invalidateLayout];
}
33
Hai Feng Kao

Я решил использовать два UICollectionViewFlowLayout. Один для портрета и один для пейзажа. Я назначаю их для моей коллекции Viewam динамически в -viewDidLoad

self.portraitLayout = [[UICollectionViewFlowLayout alloc] init];
self.landscapeLayout = [[UICollectionViewFlowLayout alloc] init];

UIInterfaceOrientation orientationOnLunch = [[UIApplication sharedApplication] statusBarOrientation];

if (UIInterfaceOrientationIsPortrait(orientationOnLunch)) {
    [self.menuCollectionView setCollectionViewLayout:self.portraitLayout];
} else {
    [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout];
}

Затем я просто изменил свои методы collectionViewFlowLayoutDelgate следующим образом

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    CGSize returnSize = CGSizeZero;

    if (collectionViewLayout == self.portraitLayout) {
        returnSize = CGSizeMake(230.0, 120.0);
    } else {
        returnSize = CGSizeMake(315.0, 120.0);
    }

    return returnSize;
}

Последнее, что я переключаюсь с макета на другой по очереди

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    if (UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
        [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout animated:YES];
    } else {
        [self.menuCollectionView setCollectionViewLayout:self.portraitLayout animated:YES];
    }
}
13
Fiveagle

Существует простой способ установить размер ячейки представления коллекции:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = CGSizeMake(cellSize, cellSize);

Не уверен, что это анимация, хотя.

8
Dannie P

Swift: ячейка просмотра коллекции, которая составляет n% высоты экрана

Мне нужна была ячейка, которая имела определенный процент высоты просмотров и меняла размеры при повороте устройства.

С помощью сверху, вот решение

override func viewDidLoad() {
    super.viewDidLoad()
    automaticallyAdjustsScrollViewInsets = false
    // if inside nav controller set to true
}

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    collectionViewLayout.invalidateLayout()
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: 100, height: collectionView.frame.height * 0.9)
}
7
DogCoffee

Если вы используете autolayout. Вам просто нужно invalidate layout в контроллере вида при вращении и отрегулируйте offset в подклассе макета потока.

Итак, на ваш взгляд контроллер -

override func willRotateToInterfaceOrientation(toInterfaceOrientation:     UIInterfaceOrientation, duration: NSTimeInterval) {
    self.galleryCollectionView.collectionViewLayout.invalidateLayout()
}

И в вашем FlowLayout Subclass

override func prepareLayout() {
    if self.collectionView!.indexPathsForVisibleItems().count > 0{
    var currentIndex : CGFloat!
    currentIndex = CGFloat((self.collectionView!.indexPathsForVisibleItems()[0] as! NSIndexPath).row)
    if let currentVal = currentIndex{
        self.collectionView!.contentOffset = CGPointMake(currentIndex * self.collectionView!.frame.width, self.collectionView!.contentOffset.y);
    }   
    }     
}
2
toofani