UITableViewCell内的UIScrollView-没有didSelect调用



我有一个tableviewCell,其中用户可以水平地scroll。由于scrollView几乎覆盖了整个cell,因此如果用户单击cell,则不会调用tableView方法didSelectRow

所以我想,我可以把UIScrollView的触摸事件传给cell,但仍然没有调用didSelectRow。我将UIScrollView划分为子类,以仅在触摸不是拖动的情况下通过触摸事件:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
    NSLog(@"touch scroll");
    // If not dragging, send event to next responder
    if (!self.dragging)
        [self.superview touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];
}

关于如何将点击传递到表、调用委托方法并在scrollview中保持滚动,有什么想法吗?

您实际上可以在不子类化UIScrollView的情况下做到这一点。无论您是有自定义单元格,还是在UITableView中的cellForRowAtIndexPath中设置属性,都可以执行以下操作:

[cell.contentView addSubview:yourScrollView];
yourScrollView.userInteractionEnabled = NO;
[cell.contentView addGestureRecognizer:yourScrollView.panGestureRecognizer];

之所以可以这样做,是因为scrollView有自己的panGestureRecognizer,程序员可以访问它。因此,只要将其添加到单元格的视图中,就会触发滚动视图的手势代理。

这种方法的唯一缺点是滚动视图的子视图不能接收任何触摸输入。如果你需要这个,你将不得不选择一个不同的方法。

我刚刚遇到了同样的问题
在您的子类中,请确保包含完整的方法集:

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesCancelled: touches withEvent:event];
    else
        [super touchesCancelled: touches withEvent: event];
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesMoved: touches withEvent:event];
    else
        [super touchesMoved: touches withEvent: event];
}
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesBegan: touches withEvent:event];
    else
        [super touchesBegan: touches withEvent: event];
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];
}

选择的答案是正确的,但我根据遇到的错误更新了代码。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.dragging) {
        [super touchesMoved:touches withEvent:event];
    } else {
        if ([self.delegate isKindOfClass:[UITableViewCell class]]) {
            [(UITableViewCell *)self.delegate touchesCancelled:touches withEvent:event];
        }
        [self.superview touchesMoved:touches withEvent:event];
    }
}

如果您的self.delegate不是UITableViewCell,请将该属性替换为单元格的属性。

单元格需要在移动过程中检索取消触摸事件,以防止出现不希望的结果。它可以很容易地复制如下。

  • 高亮显示单元格(假设滚动视图覆盖整个单元格,如果不高亮显示滚动视图(
  • 高亮显示单元格时,拖动表格视图
  • 选择任何其他单元格,现在先前高亮显示的单元格将检索didSelectCell状态

另一点要提的是秩序很重要!如果在self.superview之前未调用self.delegate,则不会发生高亮显示状态。

Swift 3

scrollView.isUserInteractionEnabled = false
contentView.addGestureRecognizer(scrollView.panGestureRecognizer)

尝试设置此

_scrollView.canCancelContentTouches = NO

此外,部分转发触摸事件是不好的

最新更新