2

UIPanGestureRecognizer用来平移我contentViewUICollectionViewCell. 我正在从两侧执行滑动手势。我正在使用平底锅,因为我希望能够将视图弹回(动画)回其原点。

UICollectionView是一个包含行的单个部分,其中每一行都是一个项目单元格(想想表)。

问题是当我向下滚动时UICollectionView,我无意中导致我的单元格移动,因为发生的拖动翻译非常少。我已经尝试实现UIScrollViewDelegate一些方法来防止单元格在滚动过程中意外移动,但即使是“触摸单元格”边缘情况仍然会触发,导致单元格轻微平移。感觉不对,因为当您滚动并且拇指触摸单元格时,您会看到许多单元格在周围平移。

关于如何在滚动时防止这种敏感性有什么好主意吗?例如,默认的 Apple Mail.app 在滚动时似乎没有这个问题;似乎有某种内在的抵抗力。

一些想法:

  • 对 x 轴上的某个开始 k 宽度应用一些阻力函数。尝试为速度执行此操作
  • 如果速度不足以看到阻力“驼峰”。
  • 尝试使用 aUIScrollView而不是平移手势识别器,但是我还需要以某种方式支持在另一侧滑动。
  • 我应该考虑为此使用 UIKit Dynamics 吗?

任何想法,将不胜感激。

4

1 回答 1

0

尝试将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

完全警告,我没有编译或测试过这种方法,但我认为它应该可以工作。:)

于 2017-10-13T18:17:11.530 回答