我有一个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
此外,部分转发触摸事件是不好的