Как отобразить Collection View с заданного индекса?


#1

Есть Collection View, каждая ячейка которого открывает Page View Controller - который листается дальше по массиву Collection View. Таким образом пользователь открывает Page View Controller например с 5 элемента из массива Collection View, потом пролистывает N страниц и закрывает Page View Controller на 145 элементе.

Как при возвращении в Collection View отобразить список со 145 элемента, а если при возвращении в Collection View 145 элемент еще и анимировать можно то это будет великолепно!!!


#2

Первое что приходит в голову - запоминать номер текущего view куда-нибудь в UserDefaults, считать его и при возвращении открыть элемент этого номера.


#3

Достаточно будет сделать делегат в PageViewController’e. Завести так же переменную, которая будет хранить текущий индекс страницы при перелистывании. А при возвращении вызывать метод из делегата и передавать индекс последней страницы. Дальше просто проскролить CollectionView к полученному индексу.


#4

Благодарю за советы!


#5

Проскроливать до заданной ячейки научился.
А вот сделать правильно анимацию не получается пока.

То есть если пользователь открывает Page View Controller например с 5 элемента из массива Collection View, потом пролистывает N страниц и N при этом не больше чем диапазон отображенных на экране ячеек в момент перехода на Page View Controller то анимация при возврате работает, а если N выходит за диапазон уже отображенных ячеек то анимация не срабатывает. При этом Collection View проматывается до нужного элемента по прежнему.

Я думаю что дело в том что ячейки dequeueReusableCell - в смысле что они переиспользуются. Помогите пожалуйста настроить анимацию.

    override func viewDidAppear(_ animated: Bool) {
        let numberCell = userDefaults.integer(forKey: "pageNumber") // получили индекс ячейки из  Page View Controller
        let indexPath = IndexPath(item: numberCell, section: 0)
        collectionView?.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.centeredVertically, animated: true) //сработал скрол
        
        let cell = collectionView?.cellForItem(at: indexPath) 
        
        UIView.animate(withDuration: 1, delay: 0.2, usingSpringWithDamping: 1, initialSpringVelocity: 0.3, options: .curveEaseInOut, animations: {
            cell?.transform = CGAffineTransform(scaleX: 1.15, y: 1.15)
        }, completion: nil)

        UIView.animate(withDuration: 1, delay: 0.8, usingSpringWithDamping: 1, initialSpringVelocity: 0.3, options: .curveEaseInOut, animations: {
            cell?.transform = CGAffineTransform(scaleX: 1, y: 1)
        }, completion: nil)
    }

#6

То что вы хотите - это плохой UX. Юзер не будет ждать и смотреть на весь процесс перелистывания. Когда он возвращается с PageViewController’a, CollectionView уже должна показывать последнюю картинку, на которой он остановился.
Плюс с dequeueReusableCell я сомневаюсь что получится сделать как вы хотите.


#7

“Перелистывание” происходит уже на странице где Collection View - занимает примерно 0.5 сек. - думаю это и процессом то не назвать. Интерфейс демонстрирует что список сместился относительно того, где юзер из него вышел. А анимация призвана еще сильнее подчеркнуть на какой ячейке был выход из PageViewController’a.

И в принципе dequeueReusableCell практически удалось обойти используя анимацию в методе

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int)

Но очень хочется узнать, может есть более грамотные способы.