Ios 手势识别器的子视图实现应开始:干扰父视图';这是该方法的实现
我有一个ParentViewController,它的视图有一个子视图。我希望ParentViewController有机会在其视图中评估手势,并且只有在这些手势失败时,子视图才有机会评估手势。但是相反,事情似乎朝着相反的方向发展,子视图实际上是在评估属于父视图的挤压手势。下面是如何设置的: ParentViewController有一个夹点手势识别器,其委托设置为ParentViewController:Ios 手势识别器的子视图实现应开始:干扰父视图';这是该方法的实现,ios,iphone,objective-c,uiview,uigesturerecognizer,Ios,Iphone,Objective C,Uiview,Uigesturerecognizer,我有一个ParentViewController,它的视图有一个子视图。我希望ParentViewController有机会在其视图中评估手势,并且只有在这些手势失败时,子视图才有机会评估手势。但是相反,事情似乎朝着相反的方向发展,子视图实际上是在评估属于父视图的挤压手势。下面是如何设置的: ParentViewController有一个夹点手势识别器,其委托设置为ParentViewController: pinchRecognizer = [[UIPinchGestureRecognizer
pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
pinchRecognizer.delegate = self;
[self.view addGestureRecognizer:pinchRecognizer];
ParentViewController实现UIgestureRecognitizerDelegate
协议,具体实现方法gestureRecognitizerShouldBegin:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer //DEPENDENCY
{
return [gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:[self superview]];
return (fabsf(translation.x) > fabsf(translation.y) && translation.x < 0);
} else if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
return YES;
}
return NO;
}
ParentViewController的视图有一个子视图。子视图具有轻触手势识别器和平移识别器:
_tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(stepTapped:)];
[self addGestureRecognizer:_tapRecognizer];
_tapRecognizer.numberOfTapsRequired = 1;
_tapRecognizer.delegate = self;
_panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self addGestureRecognizer:_panRecognizer];
_panRecognizer.maximumNumberOfTouches = 1;
_panRecognizer.delegate = self;
子视图还实现了UIGestureRecognitizerDelegate
协议,具体实现了方法GestureRecognitizerShouldBegin:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer //DEPENDENCY
{
return [gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:[self superview]];
return (fabsf(translation.x) > fabsf(translation.y) && translation.x < 0);
} else if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
return YES;
}
return NO;
}
尽管有最后两行代码,但我发现子视图的gestureRecognitzerBegin:
方法在ParentViewController之前被调用。此外,ParentViewController中的手势识别器的实现应该开始:
甚至不会运行,除非我修改子视图的实现,在发生挤压手势时返回YES
(参见最后一行):
-(BOOL)手势识别器应开始:(uigesturecognizer*)手势识别器
{
if([GestureRecognitor IsKindof类:[UIPangestureRecognitor类]]){
CGPoint translation=[(UIPangestureRecognitor*)手势识别器translationView:[自我超级视图]];
返回(fabsf(translation.x)>fabsf(translation.y)&&translation.x<0);
}else if([GestureRecognitor IsKindof类:[UITapGestureRecognitor类]]){
返回YES;
}
return[gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]];
}
使用上述代码,子视图的手势识别器应该开始:
运行,如果是捏手势,则在最后返回YES
时,将调用ParentViewController的手势识别器应该开始:
如果不清楚,我期望的行为是ParentViewController的手势识别器应该首先被调用:
,只有在失败时才会调用子视图的实现