我需要在我的应用中制作某种教程。这个想法是用户看到一种透明但略带黑暗的覆盖层,上面有一个洞。这个洞是唯一可以触及的区域。这个问题的解决方案很简单 - 你只需要实现- (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
属性。所以,你需要创建一个superview,你可以这样做:
- (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中的特定区域传递触摸事件?这甚至可能吗?
答案 0 :(得分:0)
在动画块的选项中添加它,UIViewAnimationOptionAllowUserInteraction。
UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animating
这将调用你的touchesBegan方法,但在结束帧时不会移动帧中的触摸。