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

我知道Stack上有类似的帖子,但是我找到的没有帮我找到解决方案。

  • 我有一个scrollview添加到UIView
  • 我已经将UIButton添加到scrollview上方的相同UIView中

  • 我希望UIButton响应touchUp并触发事件。
  • 如果有人在UIButton上拖动 ,我希望它将事件传递给scrollView,并在不触发按钮事件的情况下拖动UIScrollView。
  • 我知道如何通过hitTest传递返回scrollview,但这阻止了任何进入UIButton。

    不想给UIButton的加入到UIScrollView的。

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


    正如在这个答案中所解释的,一个UIButton或其他UIControl是滚动视图的子视图,它将自动响应点击,同时让滚动视图处理拖动。 然而,作为滚动视图的子视图的按钮也将随滚动内容一起移动,而不是保持在屏幕上的相同位置,因为内容在它们下面滚动。 我认为这就是为什么你不想把按钮放到滚动视图中。

    如果是这样的话,你可以通过一步来获得所需的行为。 将所有按钮放入作为滚动视图的子视图的UIView中,然后在滚动视图委托的scrollViewDidScroll方法中,将该视图的frame.origin设置为滚动视图的contentOffset。 我刚刚在我的应用中实现了这个功能,并且它工作得很好,无需做任何子类化或参与响应者链或触摸事件。


    尝试这个:

  • 在整个其他视图中添加一个与整个滚动视图contentSize一样大的透明自定义UIView到滚动视图。 (或者,也可以使其与滚动视图的宽度/高度一样大,并且每当滚动视图移动时简单地移动它。)当滚动视图决定将其触摸传递给其子视图而不是拖动时,这将是第一件事hitTested。
  • 覆盖UIView的hitTest方法。 检查触摸是否在您的按钮框架内。 如果是,返回按钮; 如果不是,则返回零。
  • 实际上,你会欺骗滚动视图,认为该按钮是其子视图之一。 我不确定这会起作用,因为我没有真正尝试过,但它看起来完全合理。


    尝试添加一个UIPanGestureRecognizerUIBUtton 。 在您指定处理平移(拖动)的回调中,您无需执行任何操作。 然后,将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 。)

    链接地址: http://www.djcxy.com/p/6903.html

    上一篇: UIButton that will ignore a 'drag' and pass it to UIScrollView

    下一篇: Extremely weird IE7/8 border/opacity compatibility issue