2014-08-29 2 views
7

Я установил UICollectionView (с раскладкой по умолчанию и вертикальной прокруткой) с пользовательскими ячейками, которые загружаются из xib. Ячейки содержат пару элементов (a UILabel и UIView) с ограничениями на них. Я настроил ограничение таким образом, что высота ячейки увеличивается по мере увеличения высоты текста этикетки с использованием нового UICollectionViewFlowLayout свойства, которое доступно в iOS8, estimatedItemSize:Вертикальная прокрутка UICollectionView с ячейками для самостоятельной калибровки отображает только половину ячеек

layout.estimatedItemSize = CGSizeMake(self.collectionView.frame.width, 100) 

Все работает как шарм кроме есть одна большая проблема : UICollectionView загружает только половину предметов, возвращенных методом numberOfItemsInSection. Итак, когда метод возвращает, скажем, 10, мой UICollectionView отображает только 5 ячеек (но отображает и выводит их отлично).

Некоторые соответствующие выводы из моих отладки попыток:

  • Я был в состоянии заставить загрузку остальных элементов вызвав invalidateLayout или изменения числа секций от 1 до 2. Но те только отладки хаки.
  • Отдельно все работает как шарм, когда я заменяю estimatedItemSize на свойство itemSize, т. Е. Жестко кодирует размер элемента. Но это побеждает функциональность саморазделения, которую я хотел бы реализовать.

Я предполагаю, что что-то не так с тем, как я думаю о ячейках, размер которых зависит от размера. В частности, мне интересно, связана ли проблема с ограничениями.

Буду признателен за любую помощь здесь.

+0

Быстрое обновление: это, кажется, артефакт более распространенных ошибок (или, может быть, мы выясним, что они просто причудливые детали реализации) размер ячейки в UITableViews и UICollectionViews. Я не собирался регистрировать радар против самонастройки UICV, но я положил его на UITableView - https://github.com/rainypixels/SelfSizingCells – rainypixels

ответ

2

Очевидный, не Hacky решение реализовать

flowLayout.collectionView(layout:sizeForItemAtIndexPath:) 

, но, конечно, это больше кода, чем вы, вероятно, надеялся.

Я хотел бы предложить вам попробовать еще две вещи:

  1. поэкспериментируйте с более правдоподобных расчетных размеров. Также попробуйте значение по умолчанию, CGSizeZero.
  2. Проверьте, что происходит в preferredlLayoutAttributesFittingAttributes(), рассмотрев параметр layoutAttributes. Может быть, вы найдете ключ к тому, почему другие ячейки «вытесняются».
+0

Спасибо, Мунди. Да, вы правы, что 'sizeForItemAtIndexPath' победит здесь. Я дал вам оба предложения. Изменение параметра «CGSize» на ширину, меньшую ширины коллекции, не меняет вещи; ячейки входят в меньшую ширину и выкладываются, как вы ожидали бы в макете потока. Все в порядке и в layoutAttributes. Тем не менее, происходит некоторое переполнение, потому что ширина свойства contentize для UICollectionView больше, чем 320pt (сейчас я тестирую iPhone). – rainypixels

+0

О, я потратил некоторое время на изучение форумов iOS dev, и, хотя в ячейках «UICollectionView» нет размеров, в двух связанных потоках я мог найти проблемы с выпуском этой функции. Это вполне может быть бета-ошибкой с реализацией. – rainypixels

+0

Что сработало для меня, это установить приблизительный размер CGSizeZero. Я попробовал «разумный» размер оценки, а также динамически менял оценочный размер, и ни один из них не помог. – Rob

1

В пользовательском подклассе UICollectionViewFlowLayout

переопределение prepareLayout как так:

- (void)prepareLayout { 
    [super prepareLayout]; 
    CGSize contentSize = self.collectionView.contentSize; 

    // Without this line, the scrolling doesn't go all the way to the bottom, right away but takes a while 
    [super layoutAttributesForElementsInRect:CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height)]; 
} 
+0

Это помогло немного, но не полностью разрешило проблему. Даже при этом мы все еще сталкиваемся с такой же ошибкой. Например, мы обнаружили, что некоторые виды коллекций помогли на одном устройстве, но затем, когда мы протестировали на другом экране, ошибка все же произошла. – ToddH

0

У меня была точно такая же проблема. я использовал layout.estimatedItemSize = CGSizeMake(373.0, 500.0) вместе с

preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes! 

и я получил именно само-проклейки поведение я хотел, за исключением того, что я получаю только половину ячеек отображаются. Любопытно, когда я изменил свойство valuItemSize на: layout.estimatedItemSize = view.bounds.size ВСЕ ячейки появляются !! Надеюсь, это поможет. Удачи.

+1

Что такое переменная 'view' в вашем примере? UICollectionView? –

3

Я считаю, что это связано с ошибкой в ​​iOS8, которая все еще существует с iOS8.3.

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

Только Apple может это исправить. Я думаю, что лучшим решением проблемы в средние сроки является наложение завышенной ценности в оценкуItemSize`.

Это репо демонстрирует проблему: https://github.com/algal/SelfSizingCellsDemo. (Я подал радар на rdar: // 18078598.)

+0

Просто наткнулся на это, пытаясь поддержать iOS8. Было мистифицировано, почему мои камеры исчезали на моем устройстве iOS8, а не на моем устройстве iOS9. Очень глупая ошибка ОС. Спасибо! – Archagon

+1

(Помните, однако, что установка оценочного значенияItemSize на что-то слишком большое приведет к тому, что индикатор прокрутки начнет прокручиваться во время прокрутки в первый раз.) – Archagon

+1

У меня все еще есть это на ios9 –

Смежные вопросы

 Смежные вопросы