Проблема с макетом UICollectionView
Я использую UICollectionView
, используя компоновку потока.
Я сделал для этого точный UICollectionViewCell
.
Но при запуске проекта консоль продолжает метать эту ошибку -
поведение UICollectionViewFlowLayout
не определено, потому что:
высота элемента должна быть меньше высоты UICollectionView
за вычетом верхних и нижних значений разделов.
Я убедился, что размер ячейки правильный
Кто-нибудь смог решить эту проблему.
Спасибо заранее.
Отношения
Nitesh
Ответы
Ответ 1
Я обнаружил, что, используя storyboards
, вы должны войти в storyboard
и нажать на общий View Controller
(вид должен быть выделен синим цветом) и перейти к Attributes Inspector
(четвертая вкладка в правая сторона экрана) и снятие флажка "Under Top Bars", "Under Bottom Bars" и "Under Opaque Bars". Это выяснило проблему для меня, и она очистила ее и для моих коллег.
Ответ 2
У меня возникли некоторые проблемы при использовании представления коллекции для представления полноэкранных контроллеров.
В основном во время выполнения он запрашивает размер элемента и просто возвращает размер представления коллекции:
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return self.collectionView.frame.size;
}
Ответ 3
Я знаю, что это очень поздний ответ, но я также испытал это.
Внутри моего контроллера представления, позвольте мне его MyViewController У меня есть UICollectionView
, который использует пользовательские UICollectionViewCell
s. Я реализую метод collectionView:layout:sizeForItemAtIndexPath, где я возвращаю размер элемента, который зависит от высоты UICollectionView
.
MyViewController создается в раскадровке, используя автозапуск для управления высотой UIViewController
.
Ячейки выглядят прекрасно в портретном режиме, но не в ландшафтном режиме.
Я решил свои проблемы, отклонив UICollectionViewLayout
моего UICollectionView
внутри метода viewWillLayoutSubviews
.
- (void)viewWillLayoutSubviews {
[self.myCollectionView.collectionViewLayout invalidateLayout];
}
Раньше я пытался отменить макет внутри willAnimateRotationToInterfaceOrientation:duration
, но это не сработало. Причина этого, вероятно, в том, что размеры для всех просмотров еще не рассчитаны, поэтому нам нужно подождать, пока автозапуск не закончит свою магию. Я ссылаюсь на этот поток SO.
Ответ 4
Если эта проблема возникла несколько раз при попытке создания представлений коллекции с полноэкранными ячейками. Моя проблема была вызвана прокладкой 4-дюймового экрана в IB/Storyboard и указанием 320 * 568 для размера элемента, но работа в симуляторе с использованием 3,5-дюймового экрана с высотой 480. Решение состоит в том, чтобы указать размер вашего элемента в код с чем-то вроде:
UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;
Это гарантирует правильность установки размера ячейки во время выполнения.
Ответ 5
Если вы используете раскадровки и автоматический макет, отладка таких проблем очень сложна...
У меня была аналогичная проблема при попытке отобразить полноэкранный режим UICollectionViewCell на iPhone.
В большинстве случаев проблема связана с размером ячейки, установленной в
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)
или непосредственно в файле flowLayout.itemSize.
Но... попробуйте:
![Selecting View Controller]()
- Затем снимите флажок "Расширить грани":
![Disable Extend Edges Options]()
И теперь попробуйте установить ограничения автоматического макета.
Удачи.
Ответ 6
Это исправило мою проблему:
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70);
}
U может видеть значение заполнения в верхней и нижней части экрана:
![введите описание изображения здесь]()
Ответ 7
Обязательно установите правильную маску авторезистора для UICollectionView и UICollectionviewcell.
Это исправило мою проблему для iPhone 4 Simulator
Ответ 8
Для меня я использую AKPickerView внутри пользовательского UIView, который давал мне множество предупреждений, подобных упомянутым здесь. Все, что я сделал, чтобы устранить предупреждения, было: Отменить флажок "Автоподбор Subviews" в Инспекторе атрибутов для моего пользовательского UIView. Это так сильно заглушало предупреждения, я думал, что мой регистратор перестает работать.
![введите описание изображения здесь]()
Ответ 9
Я просто столкнулся с тем же сообщением об ошибке, но для меня проблема заключалась в том, что когда я получил новые данные из api и попытался обновить мой CollectionView, метод, который вызвал [collectionView reloadData]
, не вызывал его в основном потоке.
Надеюсь, это поможет кому-то...
Ответ 10
У меня такая же проблема
поведение UICollectionViewFlowLayout не определено, потому что: высота элемента должна быть меньше высоты UICollectionView за вычетом верхних и нижних значений разделов.
Я решил эту проблему, проверив значения в разделе "Вставки". И для размера ячейки я использовал ниже код.
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width - 20;
CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;
return CGSizeMake(cellWidth, cellHeight);
}
Ответ 11
Если вы загружаете collectionView через представление контейнера + UICollectionViewController, вы можете установить ограничение высоты в представлении контейнера, которое ограничивает высоту самого представления коллекции. В моем случае я обнаружил, что collectionView.contentSize был выше, чем ограничение, которое я установил в своем представлении контейнера.
Очевидно, что это немного крайний случай, но на всякий случай у вас есть аналогичная настройка, я решил, что добавлю этот комментарий.
Ответ 12
Ни один из вышеперечисленных исправлений не сделал это для меня.
Я исправил это с помощью
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{CGFloat currentWidth = collectionView.frame.size.width;
UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView.
CGFloat width = currentWidth - 10;
}