通过移动 UIView 中的区域传递触摸事件

Posted

技术标签:

【中文标题】通过移动 UIView 中的区域传递触摸事件【英文标题】:Pass touch events through zone in a moving UIView 【发布时间】:2014-02-15 02:09:09 【问题描述】:

我需要在我的应用程序中制作某种教程。这个想法是,用户会看到一种透明但略微变暗的覆盖层,其中有一个洞。这个洞是唯一可以让触球通过的区域。这个问题的解决方案很简单——你只需要实现- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 甚至- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 来检查区域并只通过你想要通过的触摸。

然后,例如,这个视图开始移动。运动是由一些基本动画引起的,如下所示:

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^
  self.tutorialHoleView.center = CGPointMake(self.tutorialHoleView.center.x-160.0, self.tutorialHoleView.center.y);
 completion:nil];

您可能希望视图仅在指定区域中保持传递触摸,但事实并非如此——这里我们讨论的是视图的 self.layer.presentationLayer 属性。因此,您需要创建一个超级视图,您可以在其中执行以下操作:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

  for (UIView * subview in [self subviews]) 
    if ([subview isKindOfClass:[ETTutorialFlashlightView class]]) 
      ETTutorialHoleView * tutorialView = (ETTutorialHoleView *)subview;
      CGPoint point = [[touches anyObject] locationInView:self];
      CGRect presentationFrame = [tutorialView.layer.presentationLayer frame];
      if ((point.x >= presentationFrame.origin.x+presentationFrame.size.width/2.0-75.0) && (point.x <= presentationFrame.origin.x+presentationFrame.size.width/2.0+75.0) && (point.y >= presentationFrame.origin.y+presentationFrame.size.height/2.0-75.0) && (point.y <= presentationFrame.origin.y+presentationFrame.size.height/2.0+75.0)) 
        [self.tutorialView touchesBegan:touches withEvent:event];
      
    
  

另外,我这样做是为了将触摸传递给我的超级视图:

self.tutorialHoleView.userInteractionEnabled = NO;

令人惊讶的是,这根本不起作用。它不会通过点击事件,更不用说我也需要通过的滑动事件。所以,我的问题是——如何通过移动 UIView 中的特定区域传递触摸事件?这可能吗?

【问题讨论】:

【参考方案1】:

在动画块的选项中添加这个,UIViewAnimationOptionAllowUserInteraction。

UIViewAnimationOptionAllowUserInteraction      = 1 <<  1, // turn on user interaction while animating

这将调用您的 touchesBegan 方法,但仅在最后一帧时不会调用移动时帧中的触摸。

【讨论】:

以上是关于通过移动 UIView 中的区域传递触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

调整大小的 UIView 上没有触摸事件

通过多个 UIView 注册触摸

如何使触摸事件通过 UIView(类似于 CSS 中的 pointer-events:none)?

使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件

以 UIScrollView 作为子类的 UIView 不接收触摸事件

iOS之事件的传递和响应机制-原理篇