Ответ 1
Ха, ты сделал мой день! Я на самом деле написал это представление:)
Это на самом деле очень просто. Это представление использует UICollectionView с пользовательским UICollectionViewLayout.
Общим принципом является это. Я составляю "интервал перетаскивания" - это необходимое расстояние для перетаскивания между каждой ячейкой. Это значение произвольно, но влияет на то, сколько пользователь должен перетаскивать для переключения ячеек. Общая высота представления коллекции - это "интервал перетаскивания" * количество элементов в представлении. Затем я устанавливаю макет автоматически разбиения на страницы до ближайшего интервала перетаскивания (что дает ему поведение привязки). Это очень похоже на то, как работает покрытие. Из этого вы можете рассчитать индекс "верхней ячейки", разделив contentOffset.y на высоту.
С индексом "top cell" вы можете легко сгенерировать кадры для каждой ячейки. Кадр верхней ячейки - {0, contentOffset.y, 320, 176}, и оттуда вы можете рассчитать следующий кадр ячеек и т.д.
Затем последний трюк вычисляет интерполяцию индекса страницы. Это в основном десятичная часть текущего индекса ячейки. Это даст число от 0 до 1, которое может быть использовано для вычисления интерполяции между верхним кадром и рамкой ниже.
Каждый "prepareLayout" вычисляет кадры ячеек на экране, а затем в layoutAttributesForElementsInRect:, генерирует все атрибуты layoutAttributes на основе сгенерированных фреймов.
Используя этот трюк, вы можете создавать всевозможные сложные макеты. UICollectionView может быть мощным зверьком, но определенно требуется немного, чтобы обернуть вокруг вас голову.