UICollectionView的无限滚动---妥协做法-创新互联

项目中总有写比较变态的需求,我们的UI设计师有喜欢很酷的交互,其中有个需求类似这种的

创新互联公司服务项目包括越城网站建设、越城网站制作、越城网页制作以及越城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,越城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到越城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

        UICollectionView的无限滚动---妥协做法

    右侧部分是可以滚动的当然是无限滚动,这中效果只有UICollectionView的自定义布局才能实现,重写Layout的几个方法主要的代码就是给UICollectionViewLayoutAttributes的属性赋值,主要是为这几个center,size, transform3D;属性赋值,主要使用的是AWCollectionViewDialLayout这个三方的布局。

    但是,这个三方并没有实现无限滚动的。无限滚动也可以在scrollViewDidScroll:方法中进行检测,开头和结尾地方多添加几个元素,如果到最后一个了重新回到第一个,但是这种实现有很强的卡顿感,所以后来放弃了这个。后来,在github找到了一种办法,自定义拖拽手势UIPanGestureRecognizer

,然后再拖拽手势的target,action方法中进行判断如果状态来更改UICollectionView的偏移量,代码如下

- (void)customPan:(UIPanGestureRecognizer *)sender {
        if (sender.state == UIGestureRecognizerStateBegan) {
            self.oldOffset = self.collectionView.contentOffset;
        }
        
        if (sender.state == UIGestureRecognizerStateChanged) {
            CGPoint translation = [sender translationInView:self.collectionView];
            CGPoint offset;
            offset.y = (self.oldOffset.y - translation.y);
            if (fabsf(translation.y)>30) {
                [self.collectionView setContentOffset:offset animated:NO];
            }
        }
        
        if (sender.state == UIGestureRecognizerStateEnded) {
            CGPoint translation = [sender translationInView:self.collectionView];
            self.previousCell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:self.centerItem inSection:0]];
            NSInteger step = 1;
            step = abs(translation.y/item_height)+1;//计算需要走几步
            
            if (translation.y > 0) {////向上滑动
                if (translation.y > (item_height/2+10)) {
                    if ((0 < self.centerItem) && (self.centerItem <= (self.count - step))) {
                        self.centerItem -= step;
                    }
                }
                
            } else if (translation.y < 0){//向下滑动
                if (abs(translation.y)>(item_height/2+10)) {
                    if ((0 <= self.centerItem) && (self.centerItem < self.count - step)) {
                        self.centerItem += step;
                    }
                }
            }
            [self.collectionView setContentOffset:CGPointMake(0, self.centerItem*item_height) animated:YES];
        }
        
        }

  然后再滚动视图的scrollViewDidEndScrollingAnimation:的代理方法中来判断视图的偏移量如果到首部或者尾部就重新设置UICollectionView的偏移量,这样没有丝毫的卡顿感了,但是却有个很大的缺陷,自定义的手势没有是减速的,最多有个滚动结束时的动画。

    UICollectionView的无限滚动的方法我找了很长时间一直没有找到很理想的方法,所以这种只能算是个妥协的方法。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:UICollectionView的无限滚动---妥协做法-创新互联
本文地址:http://ybzwz.com/article/dceggg.html