在我的应用程序中,我有一个UIScrollview
,用户可以在其中查看地图(.PNG)UIImageView
。 UIScrollView
用于处理地图周围的平移和滚动。
我希望用户能够在触摸时在地图上“添加”额外的兴趣点(按钮),为此,我在UIScrollView
上添加了一个Tap Listener;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
[myScrollview addGestureRecognizer:tap];
注册点击后,我创建了一个UIButton并在UIImageView
内添加了UIScrollView
这个按钮:
[plattegrondImageview addSubview:plattegrondPunt];
这样,元素与图像一起滚动(在给定坐标上保持原位)。到目前为止一切都很好。
然而,现在我希望用户能够点击“按钮”(然后打开一个弹出屏幕以输入评论)。
我已经在按钮上添加了一个目标来监听点按:
[poi addTarget:self action:@selector(puntTap:) forControlEvents:UIControlEventTouchUpInside];
现在出现问题:
每当用户点击按钮时,选择器(puntTap)都会被正确触发,但UIScrollview
上的主要点击手势也会被触发。
因此,不仅会打开popover
视图,而且还会在屏幕上显示额外的UIButton
元素。
理论上,UIScrollview
也注册了抽头是合乎逻辑的,但在这种情况下,这是不需要的行为。每当用户点击UIButton
内的scrollview
时,scrollview
本身就不会响应。
可视化图层:
- > UIScrollview
- - - - > UIImageView
----------> UIButton
我已经为scrollview启用了以下属性;
myScrollview.userInteractionEnabled = YES;
myScrollview.canCancelContentTouches = YES;
myScrollview.delaysContentTouches = YES;
我想我可以做一些像hittest(使用UIScrollview
的Tap手势),检查它是不是一个被点击的按钮 - 但也许有人有一个'更清洁'的解决方案?
(如果对我设置屏幕的方式有任何疑问,请说明一下)
汇总:当用户点击UIButton
时,GestureRecognizer
的{{1}}也会触发!
答案 0 :(得分:1)
你可以在uibutton touchesbegan中将scrollView的userInteractionEnabled设置为False / No,并在uibutton touchesEnded中重新启用它。
另一个,也许更好的选择是将uibutton exclusiveTouch属性设置为YES。
编辑:刚看到你上面的评论。听起来,触摸正从滚动视图传播到您的uibutton。在这种情况下,您可能必须检查scrollview中的触摸坐标,并且只有在该附近不存在按钮时才添加新按钮(无论如何可能是一个好的ID想法?)。我假设你按原样存储按钮位置,所以只需检查当前列表。
答案 1 :(得分:1)
只是一个想法(未经过测试):
如果您想坚持使用GesutureRecognizers,请尝试在按钮上使用另一个,而不是直接设置目标。因此,您可以设置第一个识别器来取消另一个识别器:
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
另一个想法是通过继承hitTest:
来覆盖UIScrollView
以检查是否触摸了按钮。
答案 2 :(得分:0)
为按钮设置此属性。
myButton.exclusiveTouch = YES;
这样可以防止触摸迁移到其下方的视图。
答案 3 :(得分:0)
我认为问题是由我们对响应者链的不完整实施造成的。
当您为UIScrollView
注册tapGesture
时,它将处理在其上执行的所有点按手势。但是,它也将处理在其subviews
上执行但未由其自己处理的轻击手势。在您的情况下,按钮将属于子视图类别,因为其直接superview
(imageView
)未响应这些事件,因此触摸事件将转到scrollview。
但目前,button
仅针对UIControlEventTouchUpInside
类型的触摸事件进行了注册,而不是针对所有触摸事件进行了注册,因此其他UIControlEvents
将被传递到其响应superview
,在这种情况下UIScrollView
。
因此,如果 button handles all types of touch event
,则不会要求其superview
处理它们。