我正在使用自定义UIGestureRecognizer
子类来跟踪InfoView
课程中的手势。 InfoView
类是名为UITableViewCell
的自定义InfoCell
子类的子视图。
我已将手势识别器添加到我的根视图(屏幕上其他所有内容的父视图,因为我的自定义手势识别器的目的是允许在表之间拖动InfoCell
视图)。现在,除了一件事,一切都有效。我在UIGestureRecognizer
子类中使用以下代码来检测InfoView
视图上的触摸:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UIView *touchView = [[touches anyObject] view];
if ([touchView isKindOfClass:[InfoView class]]) {
// Do stuff
}
这里的问题是InfoView
对象上的触摸被截获,因此它们不会被转发到包含UITableView
的{{1}},这是父视图InfoCell
。这意味着我无法再拖动InfoView
视图来滚动表格视图,这是一个问题,因为InfoView
涵盖整个InfoView
。
有什么方法可以将触摸转发到表格视图上,以便它可以滚动?我已经尝试了很多东西:
InfoCell
[super touchesBegan:touches withEvent:event];
([touchView.superview.superview touchesBegan:touches withEvent:event];
获取对其父touchView.superview.superview
的引用)
但到目前为止还没有任何工作。此外,我UITableView
的{{1}}属性设置为cancelsTouchesInView
,因此不会干扰触摸。
帮助表示赞赏。谢谢!
答案 0 :(得分:25)
查看UIGestureRecognizerDelegate方法:- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
如果返回YES,则会阻止您的手势识别器踩踏UIScrollView用于检测滚动的手势识别器。
答案 1 :(得分:9)
UIGestureRecognizer具有属性“cancelsTouchesInView”,默认情况下设置为YES。这意味着当识别出手势时,UIView中的触摸被取消。尝试将其设置为NO以允许UIScrollView接收进一步的触摸事件。
答案 2 :(得分:3)
我的touchesBegan
方法中有一行将手势识别器的state
属性设置为UIGestureRecognizerStateBegan
。删除此行似乎可以解决问题。
答案 3 :(得分:3)
您可以尝试添加此通知
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) {
UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [panGestureRec velocityInView:self];
if (fabsf(point.x) > fabsf(point.y) ) {
return YES;
}
}
return NO;
}