需要阻止除iOS中叠加视图中的特定触摸之外的所有触摸

时间:2014-02-16 06:46:09

标签: ios

我正在尝试设置一个教程类型类,它提供了一个覆盖视图,并且在继续之前需要用户执行操作。我目前的层次结构设置如下。

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

在教程中,视图将被拖动,新视图将被创建等,这就是我将教程覆盖视图添加到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具有双击,平移和自定义手势,我可能只希望立即激活双击,或者可能立即激活自定义手势,或者两者都是。本教程不知道视图的手势是什么,因此它需要一种通用的方式传递所需的手势,并阻止不需要的手势。目前没有任何手势被阻止。即使我已经制作了标志,我现在也可以确定哪些手势可以通过,我仍然遇到如何阻止特定标志的问题,并让其他人通过。

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

如何继续获取我正在寻找的功能?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用 - (void)touchesBegan :( NSSet *)触及withEvent:(UIEvent *)事件?

如果您想要阻止触摸事件,可以在这里执行:

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

编辑:迟到,从来没有。我实际上遇到了需要这样做(再次......)和(又一次)在下面的评论中找到了我所指的答案=]

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

-(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.
   }
}

此时,您可以删除识别器,将值设置为他们在对象中有权访问的属性,提交通知等等。

答案 1 :(得分:0)

我不太喜欢这个解决方案,但Lyndsey Scott在评论中给出了最佳答案。

  

如果我理解正确,你可以设置UIGestureRecognizerDelegates然后只使用委托方法中的条件来指定当手势视图是教程窗口时与手势视图是主窗口时要做什么。

我宁愿不依赖这种方法,因为我试图让我的教程库完成所有的工作,但由于一段时间没有答案,我只是想把它扔出去工作