功能是左右滑。
三大关键对外值:
1.progress (进度)其实就是一个比例值 。 (吐槽一下,貌似比较难的布局都喜欢或者说都会用到比例这种方式)
2.sourceIndex(原index)
3.targetIndex (目标index)
步骤一:
判断左右滑动
偏移量与旧的偏移量进行对比:
if(变大){
则是左滑
}else if(变小){
则是右滑
}
// 2.判断是左滑还是右滑
let currentOffsetX = scrollView.contentOffset.x
let scrollViewW = scrollView.bounds.width
if currentOffsetX > startOffsetX { // 左滑
// 1.计算progress
progress = currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW)
// 2.计算sourceIndex
sourceIndex = Int(currentOffsetX / scrollViewW)
// 3.计算targetIndex
targetIndex = sourceIndex + 1
if targetIndex >= childVcs.count {
targetIndex = childVcs.count - 1
}
// 4.如果完全划过去
if currentOffsetX - startOffsetX == scrollViewW {
progress = 1
targetIndex = sourceIndex
}
} else { // 右滑
// 1.计算progress
progress = 1 - (currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW))
// 2.计算targetIndex
targetIndex = Int(currentOffsetX / scrollViewW)
// 3.计算sourceIndex
sourceIndex = targetIndex + 1
if sourceIndex >= childVcs.count {
sourceIndex = childVcs.count - 1
}
}
// 3.将progress/sourceIndex/targetIndex传递给titleView
delegate?.pageContentView(self, progress: progress, sourceIndex: sourceIndex, targetIndex: targetIndex)```
点评:
> progress = currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW)
1.利用floor函数取整,比较方便
2.
>progress = 1 - (currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW))
1减就实现了从左变右滑了
3.防越界
超就减1,当回退了,好思路
4.
if currentOffsetX - startOffsetX == scrollViewW {
progress = 1
targetIndex = sourceIndex
}
完全划过去在这种处理方式里算是比较特殊的情况了