Подтвердить что ты не робот

Проблема с макетом UICollectionView

Я использую UICollectionView, используя компоновку потока. Я сделал для этого точный UICollectionViewCell. Но при запуске проекта консоль продолжает метать эту ошибку -

поведение UICollectionViewFlowLayout не определено, потому что:  высота элемента должна быть меньше высоты UICollectionView за вычетом верхних и нижних значений разделов.

Я убедился, что размер ячейки правильный

Кто-нибудь смог решить эту проблему. Спасибо заранее.

Отношения Nitesh

4b9b3361

Ответ 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.

Но... попробуйте:

  • Выберите ViewController:

Selecting View Controller

  1. Затем снимите флажок "Расширить грани":

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;
}