iOS:点击识别器不一致

时间:2014-03-01 22:50:52

标签: ios uigesturerecognizer

我有一个如下所示的场景 Scenario

  1. 现在,我只显示一个带有标签8的视图。但我计划在HolderView中再添加3个这样的视图。

  2. SmallerView / s是从其他Nib文件创建的。

  3. 我为ViewController的视图添加了Tap Recognizer的代码

    UITapGestureRecognizer *tapRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self                                                                         action:@selector(tapRecognized2:)];
    [tapRecognizer setDelegate:self];
    [self.view addGestureRecognizer:tapRecognizer];
    

    将Tap Recognizer添加到较小视图的代码 我在HolderView中添加了较小的视图。并为其分配了标签ID。之后,

    for (SmallerView *view in HolderView.subviews) {
        UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
        [recognizer setDelegate:self];
    NSLog(@"Added gesture to the view with tag: %ld",view.tag);
    
        [view addGestureRecognizer:recognizer];
    }
    

    3。      - (void)tapRecognized:(UITapGestureRecognizer *)paramSender     {         NSLog(@“tapped on%ld”,paramSender.view.tag);     }

    - (void)tapRecognized2:(UITapGestureRecognizer *)paramSender
    {
        NSLog(@"VC view");
    }
    
    1. 我已经为所有视图启用了UserInteraction(包括代码和Inspector),也为较小的视图启用了UILabel。
    2. 现在的问题是...... 较小视图的Tap识别器实际上并不是一贯的。有时他们打印输出。突然间,它打印出ViewController的识别器输出。 请帮助

      更新: 下面是我的View图。 绿色边框:(在UIView的initWithFrame中)d

      self.layer.borderColor = [UIColor greenColor].CGColor;
      

      红色边框:

          MyTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil] objectAtIndex:0];
      self.myLabel.layer.borderColor=[UIColor redColor].CGColor;
      

      为什么绿色边界只有那么大?那不应该是完全正方形吗? 而且,只有当我点击绿色区域时,手势才有效。为什么? enter image description here

3 个答案:

答案 0 :(得分:1)

似乎您在视图上有一个点击手势识别器,并且在其超级视图上还有一个点击手势识别器。手势识别器的工作方式是,默认情况下,两者将成为识别水龙头的候选者。如果那不是你想要的,那就由你来阻止。

你可以:

  • 在手势识别器之间设置“you-go-first”关系,或者

  • 您可以使用他们的代表帮助他们做出决定,或者

  • 您可以设置子视图,以便停止超视图的手势识别器识别。

你有很多选择!

但是如果你不做任何一个,那么这个视图的手势识别器和它的superview的手势识别器都会试图识别。

答案 1 :(得分:0)

也许更好的解决方案就是将一个tapGestureRecognizer添加到父视图中。

UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
[tap addTarget:self action:@selector(handleTap:)];
[holderView addGestureRecognizer:tap];

然后添加目标方法

- (void) handleTap:(UITapGestureRecognizer *)tap {
    UIView * holderView;

    CGPoint tapPoint = [tap locationInView:holderView];
    for (UIView * v in holderView.subviews) {
        if (CGRectContainsPoint(v.frame, tapPoint)) {
            // v is the subview that was pressed.
            // add your code here.


            break;
        }
    }
}

答案 2 :(得分:0)

我为框架分配了一个新框架,边框错误。这有助于使手势正确。