UICollectionView неправильно скрывает ячейки при панорамировании и прокрутке - PullRequest
1 голос
/ 23 октября 2019

У меня есть UICollectionView с пользовательским макетом. Макет расширяет UICollectionViewLayout, а не макет потока, и я переопределяю следующие методы:

  1. collectionViewContentSize
  2. shouldInvalidateLayoutForBoundsChange:
  3. prepareLayout
  4. layoutAttributesForElementsInRect:
  5. layoutAttributesForItemAtIndexPath:

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

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

Важно, что layoutAttributesForElementsInRect: всегда возвращает действительные атрибуты, которые должны отображаться, но представление коллекции иногда игнорирует атрибуты и не отображает ячейку?

минимальный пример по адресу: https://github.com/adamwulf/CollectionViewDisappearingCells

Это ошибка UICollectionView? Это что-то еще, что я пропускаю? Я уже сталкивался с подобными проблемами переполнения стека, но все они, похоже, ссылаются на UICollectionViewFlowLayout, а не на полностью собственные макеты. Их решение - вернуть правильные атрибуты из layoutAttributesForElementsInRect:, которые я уже делаю.

Обновление: Я даже пытался вернуть все атрибуты макета из layoutAttributesForElementsInRect:, так как у меня всего ~ 20 предметов. но все время возвращать все равно не решает проблему, поэтому проблема не в том, что атрибуты не возвращаются, когда они должны быть.

Обновление: Это больше похоже на UICollectionView ошибка. Если я откорректирую frame.origin.x или frame.size.width каждого элемента, добавив всего лишь 0.0000000000001;, то ячейка больше не исчезает.

Исходный кадр элемента - (280.39666002633368, -220.39666002633371, 595.71428571428578, 834). Я могу только предположить, что есть некоторые вычисления в UICollectionView, которые имеют ошибку округления, что этот конкретный кадр (или другие уникальные кадры), который вызывает ошибку. Если у кого-то есть правильное решение / объяснение этой ошибки, я хотел бы услышать это. А пока я просто округлю значения каждого frame, чтобы обойти проблему.

Demo application showing the bug

...