您好,登錄后才能下訂單哦!
項目中總有寫比較變態的需求,我們的UI設計師有喜歡很酷的交互,其中有個需求類似這種的
右側部分是可以滾動的當然是無限滾動,這中效果只有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的無限滾動的方法我找了很長時間一直沒有找到很理想的方法,所以這種只能算是個妥協的方法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。