系统自带的Paging Enabled会把scrollView/collectionView的contentSize平均分割成几部分,每页滑动的距离不能自己控制,如下面的演示图片,每页滑动的距离是 cell.width + space + 下一个cell的一小部分,这里将介绍如何自定义每页滑动的距离,并优雅的运用到自己的项目中

部分代码:
#define itemWidth self.width-20-34
#define itemHeight self.height-20
@implementation XXHomeBrandCell
{
NSInteger selectedIndex;
}
- (void)awakeFromNib {
[super awakeFromNib];
[_collectionView registerNib:[UINib nibWithNibName:@"XXHomeBrandItem" bundle:nil] forCellWithReuseIdentifier:@"XXHomeBrandItem"];
selectedIndex = 0;
}
//主要代码
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
CGFloat x = targetContentOffset->x;
CGFloat pageWidth = itemWidth + 20;
CGFloat movedX = x - pageWidth * selectedIndex;
if (movedX < -pageWidth * 0.5) {
// Move left
selectedIndex--;
} else if (movedX > pageWidth * 0.5) {
// Move right
selectedIndex++;
}
if (ABS(velocity.x) >= 2){
targetContentOffset->x = pageWidth * selectedIndex;
} else {
targetContentOffset->x = scrollView.contentOffset.x;
[scrollView setContentOffset:CGPointMake(pageWidth * selectedIndex, scrollView.contentOffset.y) animated:YES];
}
NSLog(@"%ld",selectedIndex);
}
#pragma mark FlowLayoutDelegate
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(itemWidth, self.height-20);
}




参考:
https://github.com/Silence-GitHub/PageScrollViewDemo/blob/master/PageScrollViewDemo/PageScrollVC.swift
里面包含scrollView和collectionView的自定义分页,不过都是swift版本
网友评论
if (ABS(velocity.x) >= 2.0f){
targetContentOffset->x = pageWidth * selectedIndex;
} else {
targetContentOffset->x = scrollView.contentOffset.x;
[scrollView setContentOffset:CGPointMake(pageWidth * selectedIndex, scrollView.contentOffset.y) animated:YES];
}
这个可以根据需要,自己在滑动很快时也加上动画,可以自己看效果
static int selectedIndex=0;
static BOOL onlyOnePage=NO;
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
//MARK: 允许一下翻多页
//targetContentOffset 滚动偏移量,左右回弹时是0
NSLog(@"x=%f",targetContentOffset->x);
CGFloat x = targetContentOffset->x;
CGFloat pageWidth = scrollView.frame.size.width/2.0f;
CGFloat movedX = x - pageWidth * selectedIndex;
//计算偏移量是否在-0.5<x<0.5之间,超过了才翻页,超过0.5-1.5 1.5-2.5
if (movedX < -pageWidth * 0.5) {
// Move left
if (onlyOnePage) {
selectedIndex--;
}else{
selectedIndex-=(int)ABS((movedX+pageWidth*0.5)/pageWidth)+1;//绝对值取整
}
} else if (movedX > pageWidth * 0.5) {
// Move right
if (onlyOnePage) {
selectedIndex++;
}else{
selectedIndex+=(int)ABS((movedX-pageWidth*0.5)/pageWidth)+1;
}
}
//滑动的加速度 ABS取绝对值,不取整
if (ABS(velocity.x) >= 2.0f){
targetContentOffset->x = pageWidth * selectedIndex;
} else {
// if(onlyOnePage){
// targetContentOffset->x = pageWidth * selectedIndex;
// }else{
// targetContentOffset->x = scrollView.contentOffset.x;
// }
targetContentOffset->x = pageWidth * selectedIndex;
[scrollView setContentOffset:CGPointMake(pageWidth * selectedIndex, scrollView.contentOffset.y) animated:YES];
}
NSLog(@"%d=%f",selectedIndex,pageWidth);
}