同步动画以在表格视图中的集合视图中滚动
Posted
技术标签:
【中文标题】同步动画以在表格视图中的集合视图中滚动【英文标题】:Sync animation for scroll in collection view within table view 【发布时间】:2018-02-12 19:35:37 【问题描述】:我在许多部分的表视图中都有集合视图(在 复数 中)。我们很清楚,一个包含许多部分的单个表视图,其中只有一行,每一行都是一个单独的集合视图。
所有设置都运行良好,数据被很好地划分,代表们都已连接好,可以识别他们需要识别的所有内容。我的问题既简单又困难:每当我需要以动画方式查找特定单元格时,我想滚动到特定集合视图的位置。
到目前为止,我可以毫无问题地跳转到表格部分 (indexPath.section) 和集合项 (indexPath.row)。当我需要(同时)滚动动画时,就会出现问题。
到目前为止我的发现
我只能实现我当前的目标,即为 UITableView
停用滚动动画(UICollectionView
有/没有它都可以很好地执行)
每当我将 UITableView
selectRow 或 scrollToRow 动画标志设置为 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
进行实验(检测 tableview 和 collectionview 何时停止以执行滚动)但这意味着传播全局变量围绕代码并体验艰难的我,这只是等待发生的赛车条件。任何帮助将不胜感激。
【问题讨论】:
如果 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 中的垂直滚动