我在iOS应用程序上遇到了响应者事件链的问题。
问题如下,我在一个更大的视图(正方形)上有一组子视图(气泡),如果我点击按钮,我希望能够显示某个视图,但是如果我点击其他任何地方我希望隐藏相同的视图。
问题是当我点击一个气泡时,两个视图(孩子和父母)都在触发,我该如何防止这种情况?
如果孩子已经采取过触摸事件,那不应该结束吗?
My Bubbles正在使用UITapGestureRecognizer识别Tap手势,而父视图(方块)使用touchesBegan:方法
此图表说明了我目前的多个气泡设置:
代码:
@implementation Bubble
...
-(id) initWithFrame: (CGRect) frame {
UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
singleFingerDTap.numberOfTapsRequired = 1;
[self addGestureRecognizer:singleFingerDTap];
}
-(void) handleSingleTap {
NSLog(@"Bubble tapped, show the view");
}
for Square
@implementation Square
...
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"square touched, lets hide the view");
}
点击后,我在控制台上看到两个NSLog
答案 0 :(得分:5)
嗯,这就是问题所在。 touchesBegan
将获得所有触摸,包括手势识别器拍摄的触摸。您可以尝试设置gestureRecognizer.cancelsTouchesInView = TRUE
或使用touchesBegan为您的气泡。
由于您似乎在这里制作游戏,您使用的是像cocos2D这样的引擎吗? 如果是这种情况,可以通过更简单的方法来实现您的目标。
希望这有帮助。
干杯!
编辑:
如果您仅使用手势识别器,则不会将触摸发送到层次结构中的下一个视图。我想这就是你想要的。如果你决定开始接触,我认为你应该做这样的事情:
//在气泡视图类
中- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
if(theTouchLocation is inside your bubble)
{
do something with the touch
}
else
{
//send the touch to the next view in the hierarchy ( your large view )
[super touchesBegan:touches withEvent:event];
[[self nextResponder] touchesBegan:touches withEvent:event];
}
}
答案 1 :(得分:3)
我发现了问题所在。 UIView继承自UIResponder,触发触摸开始事件的视图检测到基本触摸事件。您在主视图中添加的子视图也会响应触摸开始方法。这非常基本。您还添加了一个带有轻敲手势识别器的选择器方法。因此,对气泡的任何触摸都会触发方法,从而触发两个日志。尝试使用其他选择器向视图添加另一个手势识别器,例如
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnBubble)];
[self.bubbleView addGestureRecognizer:tap];
UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnMainView)];
[self.view addGestureRecognizer:tap2];
-(void)tappedOnMainView
{
NSLog(@"touched on main View");
[self.vwToShow setHidden:NO];
}
-(void)tappedOnView
{
NSLog(@"tapped on bubbleview");
[self.vwToShow setHidden:YES];
}
答案 2 :(得分:1)
这样做:
@implementation Square{
...
-(id) initWithFrame: (CGRect) frame {
UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
singleFingerDTap.numberOfTapsRequired = 1;
[self addGestureRecognizer:singleFingerDTap];
}
-(void) handleSingleTap {
NSLog(@"Sqaure tapped, hide the view");
}
}
答案 3 :(得分:0)
为什么不在主视图上使用点按手势识别器?触摸开始就像编写自己的手势识别器,但更难。使用多个点击识别器,只会触发一个。