Изменение размера UICollectionViewCell на разных ориентациях устройства
Я использую UICollectionView С UICollectionViewFlowLayout.
Я устанавливаю размер каждой ячейки через
collectionView:layout:sizeForItemAtIndexPath:
при переключении с портрета на пейзаж, я хотел бы настроить размер каждой ячейки, чтобы полностью соответствовать размеру CollectionView, не оставляя отступов между ячейками.
вопросы:
1) Как изменить размер ячейки после поворот событий?
2), а еще лучше, как сделать макет, где ячейки всегда подходят под весь размер экрана?
6 ответов:
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 прокручивается по горизонтали или ширину, если он прокручивается по вертикали.
Если вы не хотите, чтобы дополнительные анимации принесли
performBatchUpdates:completion:, просто использоватьinvalidateLayoutдля принудительной перезагрузки collectionViewLayout.- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.collectionView.collectionViewLayout invalidateLayout]; }
я решил с помощью двух UICollectionViewFlowLayout. Для портрета и для ландшафта. Я назначаю их моему collectionView динамично in-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]; } }
есть простой способ установить размер ячейки представления коллекции:
UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout; layout.itemSize = CGSizeMake(cellSize, cellSize);Не уверен, если это хоть анимируются.
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) }
если вы используете
autolayout.Вам просто нужноinvalidate layoutв вашем контроллере зрения при вращении и регулировкеoffsetв вашем подклассе компоновки потока.Итак, в вашем контроллере зрения -
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { self.galleryCollectionView.collectionViewLayout.invalidateLayout() }и в
FlowLayout Subclassoverride 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); } } }
Comments