美文网首页IOSiOS学习笔记iOS程序猿
iOS开发实战 - 实现scrollView和collectio

iOS开发实战 - 实现scrollView和collectio

作者: ArchLL | 来源:发表于2018-05-03 17:59 被阅读118次

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

    OC版 collectionView自定义分页

    部分代码:

    #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);
    }
    
    
    collectionView xib 1 collectionView xib 2 flowLayout item/cell

    参考:
    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];
        }
        这个可以根据需要,自己在滑动很快时也加上动画,可以自己看效果
        ArchLL:@风清水遥 嗯嗯,谢谢你的建议
      • 风清水遥:我试了试,的确解决了我们的一些痛点,不过我发现了一个可以优化的地方,你可以更新一下,就是自定义分页后,你可以允许用户一次翻一页,还是可以多页
        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);


        }

      本文标题:iOS开发实战 - 实现scrollView和collectio

      本文链接:https://www.haomeiwen.com/subject/axjlrftx.html