中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

UICollectionView的無限滾動---妥協做法

發布時間:2020-06-24 23:32:34 來源:網絡 閱讀:2403 作者:yunsankai 欄目:開發技術

    項目中總有寫比較變態的需求,我們的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的無限滾動的方法我找了很長時間一直沒有找到很理想的方法,所以這種只能算是個妥協的方法。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东明县| 新野县| 海盐县| 泰来县| 清涧县| 延寿县| 瑞安市| 无为县| 廉江市| 白朗县| 保靖县| 罗甸县| 稷山县| 河北区| 安福县| 济源市| 礼泉县| 万州区| 郸城县| 金秀| 准格尔旗| 松原市| 绿春县| 垦利县| 关岭| 霍邱县| 蓝田县| 广昌县| 藁城市| 邵东县| 海原县| 洛宁县| 衡阳市| 札达县| 巩留县| 宜昌市| 蓝山县| 高密市| 沧源| 盈江县| 永平县|