UICOllectionView 左右滑動露出按鈕


滑動手勢

這里使用的是滑動手勢,交互比較好一些。若是要簡單的話也可以用左右掃動的手勢,直接用動畫來控制最初和最終的位置就好,而且有方法可以直接判斷左右滑動。使用pan的話就是要自己判斷上下左右的滑動方向了。下面貼了部分的滑動方法。

- (void)panGesterDidPan:(UIPanGestureRecognizer *)panGesture { switch (panGesture.state) { case UIGestureRecognizerStateBegan: { origin = [panGesture translationInView:self]; } break; case UIGestureRecognizerStateChanged: { CGPoint translation = [panGesture translationInView:self]; isLeft = (translation.x - origin.x < 0); if ((isLeft && shouldRight) || (!isLeft && !shouldRight)) { return; } CGFloat maxDistance = isLeft ? kDeleteBtnWidth - 2 : kDeleteBtnWidth; distance = (fabs(translation.x) < kDeleteBtnWidth ? translation.x : (translation.x < 0 ? - maxDistance : maxDistance)); distance = isLeft ? MIN(0, distance) : MAX(0, distance); self.contentView.center = CGPointMake(originCenter.x + rate * distance, self.contentView.center.y); } break; case UIGestureRecognizerStateEnded: if ((isLeft && shouldRight) || (!isLeft && !shouldRight)) { return; } if (distance - kDeleteBtnWidth < 6) { [UIView animateWithDuration:0.25 animations:^{ self.contentView.center = CGPointMake(originCenter.x + (isLeft ? - kDeleteBtnWidth : kDeleteBtnWidth), self.contentView.center.y); } completion:^(BOOL finished) { originCenter = self.contentView.center; shouldRight = isLeft; }]; } break; default: break; } } 

響應多個手勢

如果給cell添加手勢的話,那么scrollView就沒有辦法獲取到上下滑動的手勢了,所以我們要讓view響應多個手勢。實現gesture的代理方法就可以實現這個效果。

合理隱藏按鈕

  • 界面始終只允許一個cell滑動出按鈕
  • 界面發生上下滾動的時候隱藏按鈕

第二個比較容易實現,可以在界面發生滾動的時候將visibleCells直接調用隱藏的方法即可。

第一種排他性的隱藏確實有些費腦筋了。也可以模仿上面的方法,滑動的時候拋出個delegate給UICollectionView,然后讓UICollectionView的visibleCells隱藏除了正在操作的cell之后的所有cell按鈕。

第二種解決方案是借鑒同事的想法,在UICollectionView始終保存最后一個操作的cell,然后每次手勢開始的時候進行判斷,如果滑動的不是最后一次操作的的cell的話,就讓上一次操作過的cell進行隱藏,是自身的話什么也不做。

使用關聯對象解耦

因為要記錄上一次操作過的cell,那么肯定要有屬性來保存。這樣的話勢必要在UICollectionView里面聲明響應的屬性。這樣的話復用起來很麻煩,於是想到用runtim動態添加屬性。遞歸找到父UICollectionView,然后將currentCell對象關聯到該view上面。這里使用內容管理是OBJC_ASSOCIATION_ASSIGN是因為UICollectionView已經對cell有強引用了,所以就不需要管理了。使用話,任何UICollectionView繼承之后就可以使用了。

if (!self.parentView) { self.parentView = [self findParentView:self]; } JDGlobalAddressListCell *currentCell = objc_getAssociatedObject(self.parentView, @"currentCell"); if (currentCell != self) { [currentCell hideButtonsWithAnimation:YES]; } objc_setAssociatedObject(self.parentView, @"currentCell", self, OBJC_ASSOCIATION_ASSIGN); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM