在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动
Posted
技术标签:
【中文标题】在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动【英文标题】:Implementing swipe on view on top of UICollectionViewCell without swiping during scrolling 【发布时间】:2014-03-06 04:23:36 【问题描述】:我正在使用UIPanGestureRecognizer
在UICollectionViewCell
上平移我的contentView
。我正在从两侧执行滑动手势。我使用平移是因为我希望能够将视图弹回(动画)回其原点。
UICollectionView
是一个包含行的单个部分,其中每一行都是一个项目单元格(想想表格)。
问题是当我向下滚动我的UICollectionView
时,我无意中导致我的单元格移动,因为发生的拖动翻译非常少。我已经尝试实现UIScrollViewDelegate
方法来防止单元格在滚动过程中意外移动,但即使是“触摸单元格”边缘情况仍然会触发,导致单元格轻微平移。感觉不对,因为当您滚动并用拇指触摸单元格时,您会看到许多单元格四处移动。
关于如何在滚动时防止这种敏感性有什么好的想法吗?例如,默认的 Apple Mail.app 在滚动时似乎没有这个问题;似乎有某种内在的抵抗力。
一些想法:
对 x 轴上的某个开始 k 宽度应用一些阻力函数。尝试这样做以提高速度 如果速度不足以看到阻力“驼峰”。 尝试使用UIScrollView
代替平移手势识别器,但我还需要以某种方式支持在另一侧滑动。
我应该考虑为此使用 UIKit Dynamics 吗?
任何想法都将不胜感激。
【问题讨论】:
【参考方案1】:尝试将UICollectionView
的平移手势设置为必须失败才能使您的UICollectionViewCell
有效。使用这种方法:
// create a relationship with another gesture recognizer that will prevent this gesture's actions from being called until otherGestureRecognizer transitions to UIGestureRecognizerStateFailed
// if otherGestureRecognizer transitions to UIGestureRecognizerStateRecognized or UIGestureRecognizerStateBegan then this recognizer will instead transition to UIGestureRecognizerStateFailed
// example usage: a single tap may require a double tap to fail
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
也许通过在创建时传递的单元格上添加一个属性?
@interface YourCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) UIGestureRecognizer *blockingGestureRecognizer;
@property (strong, nonatomic) UIGestureRecognizer *internalSwipeGestureRecognizer;
@end
@implementation YourCollectionViewCell
- (void)setBlockingGestureRecognizer:(UIGestureRecognizer *)blockingGestureRecognizer
_blockingGestureRecognizer = blockingGestureRecognizer;
[self.internalSwipeGestureRecognizer requireGestureRecognizerToFail:blockingGestureRecognizer];
@end
@interface YourViewController : UIViewController
#pragma mark - UICollectionViewDataSource
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:YourCollectionViewCell.identifier forIndexPath:indexPath];
cell.blockingGestureRecognizer = collectionView.panGestureRecognizer;
return cell;
@end
完全警告,我没有编译或测试过这种方法,但我认为它应该可以工作。 :)
【讨论】:
以上是关于在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动的主要内容,如果未能解决你的问题,请参考以下文章
在 UICollectionViewCell 上设置 .reuseIdentifier
在 UICollectionViewCell 中更新 UITableView
如何在 UICollectionViewCell 中添加 UICollectionView?