需要阻止除了iOS中覆盖视图中的特定触摸之外的所有触摸

我正在尝试设置一个教程types类,它提供一个覆盖视图,并在继续之前需要来自用户的操作。 我目前有一个层次设置如下。

UIWindow |---- UIViewController | |---- UIViewA (View performing tutorial action on) | |---- UIViewB | |---- UIViewT (tutorial overlay) |---- CGRect (defined by UIViewA) 

在教程中,视图将被拖动,新的视图将被创build等,这就是为什么我将教程覆盖视图添加到UIWindow。 这样我就不用像在SO上的许多地方那样在视图控制器中混淆视图层次结构。 覆盖窗口的目的是阻止所有操作,除了本教程所需的操作。

目前,教程重叠视图的实现如下

 @interface ZSOverlayView : UIView <UIGestureRecognizerDelegate> @property (nonatomic, assign) CGRect activeRegion; @end @implementation ZSOverlayView - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return !CGRectContainsPoint(_activeRegion, point); } @end 

其中activeRegion是由UIViewA定义的CGRect。 这成功地阻止了所有不需要的事件和手势通过覆盖,activeRegion之外。 在这个特定情况下,UIViewB不会获得事件或手势。

问题是我只想要一个手势,而不是所有的UIViewA。 例如,如果UIViewA具有双击,平移和自定义手势,则可能只希望双击一次处于活动状态,或者也可以使自定义手势立即处于活动状态,或者两者兼而有之。 本教程不知道视图是什么手势,所以需要一种通用的方式来传递所需的视图,并阻止那些不需要的视图。 目前没有任何手势被阻止。 即使我现在有旗帜,这决定了什么手势应该能够通过,我仍然遇到了如何阻止具体的手势,让别人通过的问题。

我不确定如何继续,因为教程覆盖不是任何手势识别器的委托,我也不希望它是因为通过接pipe作为委托教程可能会删除现有的代表指定的特殊条件。

任何想法如何继续获得我正在寻找的function?

我不太喜欢这个解决scheme,但最好的答案是Lyndsey Scott在评论中给出的。

如果我理解正确,那么可以设置UIGestureRecognizerDelegates,然后在委托方法中使用条件来指定在手势视图是教程窗口与手势视图是主窗口时要执行的操作。

我宁愿不要依赖这种方法,因为我试图让我的教程库做所有的工作,但由于有一段时间没有答案,我只是想扔在那里,这工作。

你试过只用 – (void)touchesBegan:(NSSet *)触及事件:(UIEvent *)事件?

如果你想阻止触摸事件的东西,你可以在这里这样做:

  • 防止触摸事件的视图
  • 调用助手方法来确定哪些视图可以被触摸
  • 等等

编辑:更好的晚然后永远不会。 我实际上遇到了需要这样做(再次…),并且(又一次)find了我在下面的评论中提到的答案=]

无论如何,使用touchesBegan,你可以做到这一点(以获得所有正在接受你正在寻找的触摸types(或触摸)的手势识别器:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // In this example, I'm only actually looking for (and caring) about a single touch. if( [touches count] == 1 ) { UITouch *touch = (UITouch *)[touches anyObject]; // So here they are now NSArray *gestureRecognizersForTouch = [touch.gestureRecognizers copy]; // ... whatever else. } } 

此时,您可以删除识别器,为您的对象中所有可以访问的属性设置一个值,提交通知等等。