UICollectionView快照滚动和分页

对于具有相同大小的单元格和一个部分的集合视图,这是一种捕捉逻辑(可以轻松添加更多部分的逻辑)。

scrollViewWillEndDragging具有inout targetContentOffset参数,这意味着我们可以读取和修改滚动的结束位置。 幸运的是,我们不需要考虑插图,行或项目的间隔( 由于包含了它们而浪费了很多时间,因此无法理解为什么正确的数学会产生错误的结果 ),但是我们需要考虑情况用户滚动到最后一页的位置-targetContentOffset将在范围之内,但当前contentOffset不在范围内,因此我们也需要检查一下:

  //获取单元格宽度 
让cellWidth = collectionView(
collectionView,
布局:collectionView.collectionViewLayout,
sizeForItemAtIndexPath:NSIndexPath(forItem:0,inSection:0)).width
  let page:CGFloat //计算建议的“页面” 
让proposedPage = targetContentOffset.memory.x / cellWidth
  // 3.25应该返回第3页:floor(3.95)== floor(3) 
// 3.3+应该返回第4页:floor(4.0+)!= floor(3)
如果floor(proposedPage + 0.7)== floor(proposedPage)
&& scrollView.contentOffset.x <= targetContentOffset.memory.x {
页面=楼层(建议页面)
}
其他{
页=楼板(建议页+ 1)
}
  //替换滚动的结束位置 
targetContentOffset.memory = CGPoint(
x:cellWidth *页面,
y:targetContentOffset.memory.y

如果需要“真正的”分页,如一次滚动一页,我们需要做一些改动:

  //我们需要保存起点 
私人var startingScrollingOffset = CGPoint.zero
  func scrollViewWillBeginDragging(scrollView:UIScrollView){ 
startingScrollingOffset = scrollView.contentOffset
}
  func scrollViewWillEndDragging(scrollView:UIScrollView,速度:CGPoint,targetContentOffset:UnsafeMutablePointer ){ 
// [...]
//首先,我们使用当前的contentOffset
//代替目标
 让proposedPage = scrollView.contentOffset.x / cellWidth 

//如果向前滚动,则需要传递页面的10%:
// floor(3.1 + 0.9)!= floor(3)

//如果向后滚动,则需要达到90%以下
//上一个的//:floor(2.89 + 0.1)== floor(2)

让增量:CGFloat = scrollView.contentOffset.x
> startingScrollingOffset.x? 0.9:0.1
  //然后,我们使用delta值,而不是使用固定值 
//,并且我们还删除了targetContentOffset逻辑
 如果floor(proposedPage + delta)== floor(proposedPage){ 
// [...]
}

虽然百分比是随机选择的,但对于真正的分页来说,0.1感觉要好一些,而对于快速滚动则感觉要好于0.3。