我有一个带有UIViews的UIScrollView。 UIScrollView启用了双指滚动。每个UIView都有一个panGestureRecognizer。我想要以下功能:
如果是双触式平底锅 - >滚动。
如果是单触式锅&&触摸UIView - >解雇UIView的panGestureRecognizer。
我想通过覆盖UIScrollView的hitTest来做到这一点。如果触摸次数大于1,则返回UIScrollView以进行滚动。如果触摸次数为1,则返回正常的hitTest结果可能会触发UIView的panGestureRecognizer。但我的UIScrollView的hitTest代码从来没有任何接触! (虽然我成功地用双指滚动,但hitTest没有任何触摸。)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSSet *touches = [event touchesForView:self];
NSLog(@"%@", touches);
if ([touches count] > 1)
{
return self;
}
UIView *usualView = [super hitTest:point withEvent:event];
return usualView;
}
答案 0 :(得分:1)
HitTest是一种用于处理触摸的低级可覆盖方法,或者更好地说,用于检测触摸的目的地。您无法知道此处的触摸次数 - event
参数无用。相反,每次触摸都会被调用两次,这意味着对于双触摸,您会被调用4次。
它不适合检测内部的多个触摸或手势,仅适用于触摸的目的地。
默认实现类似于:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (self.hidden || !self.userInteractionEnabled || self.alpha < 0.01 || ![self pointInside:point withEvent:event] || ![self _isAnimatedUserInteractionEnabled]) {
return nil;
} else {
for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
UIView *hitView = [subview hitTest:[subview convertPoint:point fromView:self] withEvent:event];
if (hitView) {
return hitView;
}
}
return self;
}
}