我有一个tableviewCell
,用户可以横向scroll
。由于scrollView
几乎涵盖整个cell
,因此如果用户点击tableView
,则didSelectRow
方法cell
不会被调用。
所以我想,我可以将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
内的滚动的任何想法?
答案 0 :(得分:16)
实际上,您可以在不继承UIScrollView
的情况下执行此操作。无论您是自定义单元格,还是在cellForRowAtIndexPath
的{{1}}中设置属性,您都可以执行以下操作:
UITableView
你可以这样做的原因是因为scrollView有自己的panGestureRecognizer,程序员可以访问它。因此,只需将其添加到单元格的视图中,就会触发scrollview的手势委托。
此方法的唯一缺点是滚动视图的子视图无法接收任何触摸输入。如果您需要,您将不得不选择不同的方法。
答案 1 :(得分:7)
我刚遇到同样的问题。
在您的子类中,请确保包含完整的方法集:
-(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];
}
答案 2 :(得分:0)
所选答案是正确的,但我根据我遇到的错误更新了代码。
- (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.delegate
之前未调用self.superview
,则突出显示的状态不会发生。
答案 3 :(得分:0)
Swift 3
scrollView.isUserInteractionEnabled = false
contentView.addGestureRecognizer(scrollView.panGestureRecognizer)
答案 4 :(得分:-1)
尝试设置此
_scrollView.canCancelContentTouches = NO
另外,部分转发触摸事件是不好的