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。
- 在iOS 8.1下出现UIPopoverController之前的不可预知的延迟
- Swift 3 LPCM录音机| 错误:kAudioFileInvalidPacketOffsetError
- 位置经理的准确性不是很准确
- 使用蓝牙扫描仪/键盘在iOS / Safari上监听HTML / JavaScript中的按键,而无需专注于某个字段
- 如何在ViewDidLoad上显示FullScreenSlideshowViewController
- 捕获用户位置:澄清
- MonoTouch UIWebView和EvaluateJavascript
- 为UIImageview设置Uianimation和Touch Event
- 如何在iOS上捕获的video中添加水印