UIButton将忽略'拖动'并将其传递给UIScrollView

时间:2011-05-13 10:10:19

标签: iphone ios uikit uiscrollview uibutton

我知道Stack上有类似的帖子,但我发现的任何内容都没有帮助我找到解决方案。

  • 我将滚动视图添加到 UIView
  • 我已将 UIButton 添加到滚动视图上方的相同UIView

    1. 我希望UIButton响应touchUp并触发事件。
    2. 如果UIButton上有人 DRAGS ,我希望将事件传递给scrollView并拖动UIScrollView而不触发按钮事件。

我知道如何使用hitTest传递触摸返回滚动视图,但这会阻止任何进入UIButton的内容。

想要将UIButton添加到UIScrollView。

有没有人有建议的解决方案?

4 个答案:

答案 0 :(得分:1)

试试这个:

  1. 在整个滚动视图contentSize上添加一个与所有其他视图一样大的透明自定义UIView。 (或者,使其与滚动视图宽度/高度一样大,只需在每次滚动视图移动时移动它。)当滚动视图决定将其触摸传递给其子视图而不是拖动时,这将是第一件事hitTested。
  2. 覆盖UIView的hitTest方法。检查触摸是否在按钮框内。如果是,请返回按钮;如果没有,请返回nil。
  3. 实际上,你会欺骗滚动视图,认为该按钮是其子视图之一。我不确定这会起作用,因为我没有真正尝试过,但它似乎完全合情合理。

答案 1 :(得分:1)

尝试向UIPanGestureRecognizer添加UIBUtton。在您指定处理平移(拖动)的回调中,您无需实现任何操作。然后,将cancelsTouchesInView设置为YES。这将使您的按钮将拖动手势传递给其他视图。

        UIPanGestureRecognizer *gr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan)];
        [gr setCancelsTouchesInView:YES];
        [myButton addGestureRecognizer:gr];
        [gr release];

这里是handlePan

-(void)handlePan
{
    // Do nothing
}

我遇到了类似的情况,我有一个UIScrollView,其中包含两个UIView个子视图。每个UIView都包含UISlider。我想捕捉(并放下)垂直拖动(这是手势识别器进入的位置),但我还需要水平滚动按照您的预期在滑块中工作并向左和向右平移滚动视图。这是解决方案。 (手势识别器附加到每个UIView。)

答案 2 :(得分:1)

试试这个:子类化UIScrollView,在touchesShouldCancelInContentView:方法中返回YES。

答案 3 :(得分:0)

this answer中所述,作为滚动视图子视图的UIButton或其他UIControl将自动响应点击,同时让滚动视图处理拖动。但是,作为滚动视图子视图的按钮也将随滚动内容一起移动,而不是在内容在其下方滚动时保留在屏幕上的相同位置。我假设这就是你不想把按钮放到滚动视图中的原因。

如果是这种情况,您可以再一步获得所需的行为。将所有按钮放入UIView,它是滚动视图的子视图,然后在滚动视图的委托的scrollViewDidScroll方法中,将该视图的frame.origin设置为滚动视图的contentOffset。我刚刚在我的应用程序中实现了它,它工作得很好,无需进行任何子类化或参与响应链或触摸事件。