如何创建像iOS 11 App Store这样的侧面偷看的单元格

集合视图的滚动和分页一直是我的一个谜。 直到最近,我们才有一个项目的需求,在该项目中,有一个集合视图显示了上一个和下一个项目的一部分。 因此,现在该深入研究实现此功能了。

我最终决定实现自己的逻辑并从中创建一个pod,以便可以轻松地将其集成到项目中。

该功能在此处可用:

MaherKSantina / MSPeekCollectionViewDelegateImplementation

MSPeekCollectionViewDelegateImplementation –一种自定义的分页行为,可在页面中窥视上一个和下一个项目

github.com

自述文件包含使之正常运行所需的所有必要信息。 为了方便起见,下面是一个示例:

如果您有兴趣了解MSPeekCollectionViewDelegateImplementation的内部工作原理,请继续下一节。

本节将介绍偷看委托实现的主要功能。 (此处未显示所有代码,但Github存储库中包含所有代码)

我们将不依赖集合视图中已经存在的分页行为,而是将实现自己的逻辑。 因此,“ Paging Enabled复选框将被取消选中。

布局:

这是一个显示视图的不同组件的图:

您可以使用委托函数为像元间距设置任何值:

我们可以使用委托函数来做到这一点:

在索引路径处插入段

由于单元格将占据剩余空间,因此我们可以设置单元格的项目大小,如下面的委托函数所示:

索引路径中项目的大小

由于有两个从侧面窥视的单元格,因此从左右两个单元格之间有两个空格,可以使用以下公式计算itemWidth:

 让itemWidth = collectionView.frame.size.width-2 *(cellSpacing + cellPeekWidth) 

如果集合视图的宽度小于peek +间距,则max函数仅用于防止出现负值。

为了安全起见,我们还将最小项目间距设置为0:

最小项目间距

逻辑:

我们将引入一个名为scrollThreshold的新参数。 这将确定需要多少滚动才能捕捉到相邻的单元格。

当用户开始使用以下命令拖动时,我们将通过保存滚动偏移量来计算滚动距离:

滚动视图将开始拖动

这是主要部分。 我们可以使用委托函数scrollViewWillEndDragging来实现逻辑。

滚动视图将结束拖动

让我们将其分为几个步骤:

  1. 我们从targetContentOffset指针获取滚动视图将停止拖动的目的地。 指针指向滚动视图将停止的位置。 更改此值将更改滚动视图停止的位置,并且它将自动为其设置动画,而无需进行任何额外的工作。
  2. 计算滚动的总距离。
  3. 检查滚动的幅度是否大于scrollThreshold并创建一个系数,该系数具有3个值(-1、0、1)之一。 这将被添加到当前索引中。
  4. 通过将偏移量除以项目宽度来获取当前索引
  5. 将在步骤3中检索到的系数添加到当前索引。
  6. 首先将项目宽度添加到单元格间距中,然后将其乘以在步骤5中获取的新的相邻项目索引,以获取相邻项目滚动偏移量
  7. targetContentOffset指针设置为新值,这会将集合视图滚动到该偏移量。

注意:请确保将集合视图的减速度设置为快,否则动画将变慢:

collectionView.decelerationRate = UIScrollViewDecelerationRateFast

感谢您查看本教程。 该存储库仍处于早期阶段,计划在不久的将来实现新功能。 欢迎任何人为该项目做出贡献并添加问题。

如果您觉得有用,请不要忘了加注星标并共享它。