在表格视图中同步动画以在集合视图中滚动

时间:2018-02-12 19:35:37

标签: ios swift uitableview animation uicollectionview

我在许多部分的表格视图中有集合视图(在复数中)。我们已经清楚了,一个包含许多部分的单个表视图,每个部分只有一行,就是一个单独的集合视图。

enter image description here

所有设置都运行得很好,数据分工很好,代表们都接通了识别他们需要识别的所有内容。我的问题很简单,但同时也很困难:每当我需要以动画方式找到特定的单元格时,我想滚动到特定的集合视图位置。

到目前为止,我能够毫无问题地跳转到表部分(indexPath.section)和集合项目(indexPath.row)。当我需要使用动画滚动(同时)时会出现问题。

到目前为止我的发现

  1. 我只能实现目前的目标,停用UITableView的滚动动画(UICollectionView可以很好地执行/退出)

  2. 每当我将UITableView selectRow scrollToRow 动画标志设置为 true 时,应用程序崩溃(99%肯定)发生这种情况是因为我试图访问并且由于动画尚未显示而导致"隐藏"部分。

  3. 相关的代码片段

    @IBOutlet weak var albumTableView: UITableView!
    @IBOutlet weak var stickersCollectionView: UICollectionView!
    
    func locateCell() {
        ...
        let stickerIndex = methodThatReturnsExactIndex()
        let sectionIndex = IndexPath(row: 0, section: stickerIndex.section)
        albumTableView.selectRow(at: sectionIndex, animated: false, scrollPosition: .top)
        let rowIndex = IndexPath(item: stickerIndex.row, section: 0)
        stickersCollectionView.scrollToItem(at: rowIndex, at: 0, animated: true)
    }
    

    我正在尝试使用UIScrollViewDelegate(检测 tableview collectionview 何时停止以执行滚动),但这意味着传播代码周围的全局变量和经验让我很难接受竞争条件等待发生。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先使用/不使用动画将tableView滚动到该特定索引。现在,通过提供indexPath,您可以访问collectionView内的tableViewCell对象,从而使该单元格可见。然后让您collectionView滚动到具有/不包含动画的特定indexPath。 拿另一个全局bool存储tableView开始滚动。还存储用于收集的indexPath和tableView,并使用选项卡

tableViewIsScrolling = true
let yourSelectedIndexPathForTableView = IndexPath(row: 0, section: 4)//store it globally
let yourSelectedIndexPathForCollectionView = IndexPath(row: 10, section: 0)//store it globally

tableView.scrollToRow(at: yourSelectedIndexPathForTableView, at: .middle, animated: false)



func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
    if tableViewIsScrolling {
        tableViewIsScrolling = false
        //Perform your scrolling of CollectionView
        guard let yourCell = tableView.cellForRow(at: yourSelectedIndexPathForTableView) as? YourCell else {return}
        yourCell.collectionView.scrollToItem(at: yourSelectedIndexPathForCollectionView, at: .centeredHorizontally, animated: true)
    }
}