在scrollview内部的imageview内点击uibutton

时间:2012-03-06 13:23:40

标签: iphone uiscrollview uiimageview uibutton uigesturerecognizer

在我的应用程序中,我有一个UIScrollview,用户可以在其中查看地图(.PNG)UIImageViewUIScrollView用于处理地图周围的平移和滚动。

我希望用户能够在触摸时在地图上“添加”额外的兴趣点(按钮),为此,我在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}}也会触发!

4 个答案:

答案 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上执行但未由其自己处理的轻击手势。在您的情况下,按钮将属于子视图类别,因为其直接superviewimageView)未响应这些事件,因此触摸事件将转到scrollview。

但目前,button仅针对UIControlEventTouchUpInside类型的触摸事件进行了注册,而不是针对所有触摸事件进行了注册,因此其他UIControlEvents将被传递到其响应superview,在这种情况下UIScrollView

因此,如果 button handles all types of touch event ,则不会要求其superview处理它们。