UITableViewCell 上的 UIPanGestureRecognizer 覆盖 UITableView 的滚动视图手势识别器

Posted

技术标签:

【中文标题】UITableViewCell 上的 UIPanGestureRecognizer 覆盖 UITableView 的滚动视图手势识别器【英文标题】:UIPanGestureRecognizer on UITableViewCell overrides UITableView's scroll view gesture recognizer 【发布时间】:2012-04-17 00:38:35 【问题描述】:

我已将UITableViewCell 子类化,并在该类中应用了平移手势识别器:

UIPanGestureRecognizer *panning = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanning:)];
panning.minimumNumberOfTouches = 1;
panning.maximumNumberOfTouches = 1;
[self.contentView addGestureRecognizer:panning];
[panning release];

然后我实现了应该允许在表格视图中同时进行手势的委托协议:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    return YES;

然后我在 handlePanning 方法中放置一个日志,只是为了查看它何时被检测到:

- (void)handlePanning:(UIPanGestureRecognizer *)sender 
    NSLog(@"PAN");

我的问题是我无法垂直滚动表格视图中的单元格列表,并且无论我平移哪个方向都会调用handlePanning

我想要的是 handlePanning 仅在只有水平平移而不是垂直平移时才被调用。希望得到一些指导。

【问题讨论】:

【参考方案1】:

您是否尝试过设置pannings 委托属性?

panning.delegate = /* class name with the delegate method in it */;

您还需要使该类符合 UIGestureRecognizerDelegate。

【讨论】:

【参考方案2】:

子类化平移手势识别器并使其仅识别水平平移。有一个很棒的 WWDC 2010 视频,介绍了可用的自定义手势识别器问题。实际上有两个关于该主题的,请查看https://developer.apple.com/videos/archive/:

使用手势识别器简化触摸事件处理 高级手势识别

【讨论】:

【参考方案3】:

在 tableview 上添加手势识别器。从中,您可以获得单元格对象。从那里您可以处理单元格功能。对于每个手势,都会有一个开始、更改和结束状态。因此,存储开始位置。

    CGPoint beginLocation = [gesture locationInView:tblView]; // touch begin state.

    CGPoint endLocation = [gesture locationInView:tblView]; // touch end state.

利用这一点,可以得到IndexPath

    NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:beginPoint];

从此索引路径,您可以访问单元格。

            UITableViewCell *cell = [tableview cellForRowAtIndexPath : indexPath];

使用这个 Cell 对象,您可以处理它。

【讨论】:

"indexPathForRowAtPoint" - 谢谢,正是我找的【参考方案4】:

您是否尝试过将bounces 属性设置为NO?

【讨论】:

以上是关于UITableViewCell 上的 UIPanGestureRecognizer 覆盖 UITableView 的滚动视图手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 上的动画

如何使 UITableViewCell 上的 UIProgressView 立即更改?

UITableViewCell 上的 UITextView

UITableViewCell 内的 UIView 上的 UIGestureRecognizer

UITableViewcell 和 UITableVIew 上的手势识别器

自定义 UITableViewCell:“loadNibNamed:”上的 SIGABRT