Как синхронизировать c позицию прокрутки нескольких встроенных uicollectionview в uitableview? - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь быстро создать видеоредактор. У меня есть центральный UITableview с несколькими строками, первая строка содержит uicollectionview, который содержит временную шкалу видео, а строка после этого имеет другой uicollectionview, который содержит эффект / редактирование. то, что я хотел бы сделать, это поддерживать и устанавливать положение прокрутки каждого представления коллекции на основе представления коллекции на временной шкале.

Теперь у меня есть следующее, индекс 0 - это временная шкала

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        // the row for the video timeline

        if(indexPath.row == 0){

            let cell:CellTBVideoTimeline = tableView.dequeueReusableCell(withIdentifier: "CellTimeline") as! CellTBVideoTimeline //1.


            // setup and calculate the offset to center the content

            let centrePoint:CGFloat =  (UIScreen.main.bounds.width - 20 - 20) / 2

            let collectionViewLayout = cell.collectionview.collectionViewLayout as? UICollectionViewFlowLayout

            collectionViewLayout?.sectionInset = UIEdgeInsets(top: 0, left: centrePoint, bottom: 0, right: centrePoint)

            collectionViewLayout?.invalidateLayout()


            return cell

        }

        // the rows for actions

        else {

            let cell:CellTBAction = tableView.dequeueReusableCell(withIdentifier: "CellAction")! as! CellTBAction //1.


            // setup and calculate the offset to center the content

            let centrePoint:CGFloat =  (UIScreen.main.bounds.width - 20 - 20) / 2

            let collectionViewLayout = cell.collectionview.collectionViewLayout as? UICollectionViewFlowLayout

            collectionViewLayout?.sectionInset = UIEdgeInsets(top: 0, left: centrePoint, bottom: 0, right: centrePoint)

            collectionViewLayout?.invalidateLayout()


            // setup and calculate the offset to center the content

           if(self.timelineScrollPoint != nil){
                cell.collectionview.contentOffset = self.timelineScrollPoint!
            }

            return cell

        }

    }

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {

        //  if it is the tableview ignore the scrolling

        if let _ = scrollView as? UITableView {
        }

        // if it is the collectionview loop through and match up all the collectionview offsets

        else if let _ = scrollView as? UICollectionView {

            if(scrollView.tag == 0){

                self.timelineScrollPoint = scrollView.contentOffset

                for cell in tableviewMain.visibleCells {

                   if let customCell = cell as? CellTBAction {

                    customCell.collectionview.contentOffset = self.timelineScrollPoint!

                   }

                }

            }


        }

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

Я пробовал это ответ

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(10), execute: {
    collectionView.contentOffset = self.initialContentOffset!
})

хотя это вроде как исправляет, результаты довольно плохие, так как вы можете видеть, как ячейки прыгают.

Есть идеи, как я могу решить эту проблему или выбрать другой подход.

...