通过移动 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(类似于 CSS 中的 pointer-events:none)?
使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件