2

Я пытаюсь реализовать ту же функцию, что и мобильная Safari, когда прокручивается среди разных страниц с помощью UICollectionView. Одна страница находится посередине, а некоторые другие также видны.UICollectionView - горизонтальный пейджинг с видимыми 3 страницами и 1 в середине с использованием UICollectionView

enter image description here

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

- (CGRect)rectForTargetPageForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity 

В этом методе я могу установить, где именно UICollectionView остановится. Однако опыт прокрутки не так хорош, как при использовании UIScrollview с включенным пейджингом. Когда я проскользнул с большей скоростью, несколько страниц были прокручены и остановились на предлагаемой странице. То, что я хочу достичь, - это то же поведение, что и обычный просмотр прокрутки с включенным пейджингом - независимо от скорости, которую я использую, я получу только одну страницу.

Есть ли у кого-нибудь идеи, как это решить, используя UICollectionView?

+0

Почему вы не могли просто игнорировать параметр 'velocity' в этом методе и возвращать прямоугольник для следующей страницы? – Tricertops

+0

Я пробовал это, и прокрутка мне кажется странной. Это не так хорошо, как пейджинг. –

+0

См. Мой ответ ниже ... – Tricertops

ответ

0

Таким образом, вы хотите сделать размер страницы меньше, чем размер прокрутки, так? Размер страницы всегда такой же, как размер прокрутки, поэтому у вас есть сделать прокрутку более мелким.

Тогда есть еще одна проблема. Как получить штрихи из диапазона вид прокрутки?

Переопределить -[UIView pointInside:withEvent:] вид прокрутки для проверки больших границ, чем они есть на самом деле. Тогда прикосновения должны работать.


На самом деле я не пробовал это сам, я делал это путем размещения дополнительного вид сверху с заданными границами и переопределить -[UIView hitTest:withEvent:]. Внутри я изменил точку и назвал тест прокрутки прокрутки. Таким образом, касания обрабатывались просмотром прокрутки, но их положение было неправильным. Вы можете попытаться объединить эти два подхода, чтобы получить правильную позицию.

+0

У меня нет проблем с этим, мне просто нужно иметь 3 страницы в одном прокрутке и пейджинге. Но проблема в том, что подкачка подходит только в том случае, если есть одна страница с таким же размером кадра, что и весь просмотр коллекции. Если я создаю страницы меньше, так что я могу видеть другие 2 страницы, пейджинг работает неправильно. И когда я устанавливаю clipToBounds в NO, страницы, которые находятся за пределами границ, сразу же удаляются из иерархии представлений. –

+0

Я не думаю, что вы можете с этим что-то сделать. Вы можете добиться этого, используя только просмотр прокрутки и вставку страниц вручную. – Tricertops

+1

Я нашел решение. Я должен установить пейджинг включен, установить клипы для ограничений на НЕТ и затем перекрывать элементы. В подклассе макета потока я должен возвращать неперекрывающийся размер содержимого, так что ячейки не удаляются из иерархии представлений, они прокручиваются за пределы. Нужно будет немного его настроить, но это может сработать. –

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