Я пытаюсь быстро создать видеоредактор. У меня есть центральный 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!
})
хотя это вроде как исправляет, результаты довольно плохие, так как вы можете видеть, как ячейки прыгают.
Есть идеи, как я могу решить эту проблему или выбрать другой подход.