在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动

Posted

技术标签:

【中文标题】在 UICollectionViewCell 上实现在视图上滑动而不在滚动期间滑动【英文标题】:Implementing swipe on view on top of UICollectionViewCell without swiping during scrolling 【发布时间】:2014-03-06 04:23:36 【问题描述】:

我正在使用UIPanGestureRecognizerUICollectionViewCell 上平移我的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 中添加模糊

在 UICollectionViewCell 上设置 .reuseIdentifier

在 UICollectionViewCell 中更新 UITableView

如何在 UICollectionViewCell 中添加 UICollectionView?

如何在 UICollectionViewCell 上设置 UILabel?

UICollectionViewCell 边框/阴影