- (CGPoint)nearestTargetOffsetForOffset:(CGPoint)offset withVelocity:(CGPoint)velocity
{
//滑动视图在最左侧的时候再往最左侧滑或者在最右侧的时候再往最右侧滑的时候就不用计算了
if (self.adCollectionView.contentOffset.x < 0 || self.adCollectionView.contentOffset.x + self.adCollectionView.width > self.adCollectionView.contentSize.width) {
return offset;
}
CGFloat pageSize = self.cellWidth + self.padding;
CGFloat targetX;
CGFloat currentCenterX = [self _getCurrentCenterXWithPageSize:pageSize];
//10pt的设置是为了让滑动视图只要有一点滑动动作,就让他滚到下一个页面,使用系统自己的滚动判定在手动滑动的距离较短时会导致视图抖动
//带速度的时候(也就是轻扫)才让他滑到下一页
if (offset.x - currentCenterX >= 10.f && velocity.x > 0) {
_curPage++;
} else if (offset.x - currentCenterX < -10.f && velocity.x < 0) {
_curPage--;
} else if (offset.x - currentCenterX >= pageSize / 2.f && velocity.x == 0) {
_curPage++;
} else if (offset.x - currentCenterX < -pageSize / 2.f && velocity.x == 0) {
_curPage--;
}
targetX = [self _getCurrentCenterXWithPageSize:pageSize];
[self.pageControl setCurIndex:_curPage];
return CGPointMake(targetX, offset.y);
}
- (CGFloat)_getCurrentCenterXWithPageSize:(CGFloat)pageSize
{
return pageSize * _curPage - ((self.adCollectionView.width - self.cellWidth) / 2.f); //实际上每次滑动的分页的大小并不一定是item的大小,为了使停止的时候item居中,需要减掉多余部分的x,16是左边的inset(说白了就是滑的多了,要减掉补偿一下)
}