Как использовать прокрутку до ячеек в обратном вызове scrollViewDidScroll? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующая функция, которая автоматически прокручивает мою временную шкалу до последней возможной ячейки, когда ячейки отображаются.

var onceOnly = false
internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if !onceOnly {
        let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
        collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
        let firstPost = posts.first?.timeStamp
        let firstOfFirstMonth = firstPost?.startOfMonth()
        let diff = posts.last?.timeStamp.months(from: firstOfFirstMonth!)
        //self.currentPostMonth = diff
        let monthCellIndexPath = IndexPath(row: diff!, section: 0)
        timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)
        onceOnly = true
    }
} 

Затем я хочу определить, когда моя временная шкала закончила прокрутку, и, как только она это сделает, вызовет определенный метод для этой ячейки (cell.drawArrow)

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView == self.timeline {
        let months = self.posts.first?.timeStamp.startOfMonth().months(from: (self.posts.last?.timeStamp)!)
        let monthCellIndexPath = IndexPath(row: months!, section: 0)
        print("cells are",self.timeline.visibleCells)
        if let optionalCell = self.timeline.cellForItem(at: monthCellIndexPath) {
            let cell = optionalCell as! TimelineMonthViewCell
            let day = Calendar.current.component(.day, from: self.currentPostDate!)
            cell.drawArrow(day: day)
        } else {
            print("cell out of range")
        }
    }
}

прямо сейчас он печатает "ячейки []" и "ячейка вне диапазона". Таким образом, он находит пустой массив видимых ячеек и не может найти последнюю ячейку в диапазоне, который он показывает на экране. Я предполагаю, что это означает, что он пытается выполнить это до того, как загрузит видимые ячейки? Даже если я считаю, что обратный вызов должен вызываться после того, как он загружен теми, кто считает его прокрученным?

В любом случае, как я могу это сделать?

1 Ответ

0 голосов
/ 05 сентября 2018

Порядок событий:

let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
// callback
// more work to do

Итак, обратный вызов поступает до того, как вы закончили свою работу.

Нет анимации, поэтому вам не нужен обратный вызов, и в любом случае это неправильный обратный вызов. Если у вас есть еще много работы, просто сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...