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

Posted

技术标签:

【中文标题】同步动画以在表格视图中的集合视图中滚动【英文标题】:Sync animation for scroll in collection view within table view 【发布时间】:2018-02-12 19:35:37 【问题描述】:

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

所有设置都运行良好,数据被很好地划分,代表们都已连接好,可以识别他们需要识别的所有内容。我的问题既简单又困难:每当我需要以动画方式查找特定单元格时,我想滚动到特定集合视图的位置。

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

到目前为止我的发现

    我只能实现我当前的目标,即为 UITableView 停用滚动动画(UICollectionView 有/没有它都可以很好地执行)

    每当我将 UITableView selectRowscrollToRow 动画标志设置为 true 时,应用程序就会崩溃(99% 肯定会发生这种情况因为我正在尝试访问并且由于动画尚未显示而“不可见”部分)。

代码的相关sn-ps


@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 进行实验(检测 tableviewcollectionview 何时停止以执行滚动)但这意味着传播全局变量围绕代码并体验艰难的我,这只是等待发生的赛车条件。任何帮助将不胜感激。

【问题讨论】:

如果 m 没有错,您首先希望通过垂直滚动来动画到 tableView 的该部分,然后水平滚动到特定时刻。所有这些动画都应该发生在一个事件上。例如到达一些推送通知。 【参考方案1】:

首先滚动您的tableView 到带有/不带有动画的特定索引。这将使该单元格可见现在通过提供该indexPath 获取您的单元格,以便您可以访问tableViewCell 中的collectionView 对象。然后让您 collectionView 滚动到特定的 indexPath 带/不带动画。 取另一个全局布尔值来存储 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)
    

【讨论】:

重点是让它们都为滚动设置动画。您共享的代码的 sn-p 几乎就是我在项目工作中已经拥有的(因为它消除了 UITableView 动画) 阅读问题的最后一段。我沿着这条路走下去,我必须在代码中引入很多变量和状态,从长远来看,它很简单,既不可测试也不可维护。还是谢谢

以上是关于同步动画以在表格视图中的集合视图中滚动的主要内容,如果未能解决你的问题,请参考以下文章

表视图行中集合视图的同步水平滚动

使用自动布局的表格视图中的水平集合视图

表格单元格中的集合视图。这是重用的错误

以编程方式禁用 UICollectionView 中的垂直滚动

在 ios 8 中将集合或表格视图或自定义视图添加到滚动视图

如果集合视图嵌入到 ios 的表视图中,如何始终显示集合视图的第一项