【问题标题】:About UIScrollView and UILongPressGesture关于 UIScrollView 和 UILongPressGesture
【发布时间】:2014-11-10 05:39:24
【问题描述】:

我有一个视图,他有一个UIScrollView 作为子视图。 UIScrollView 的框架大约是根视图的一半。我想在根视图中添加一些手势处理程序。因为我想确切地知道触摸何时开始、移动和结束。由于某些其他原因,我不想覆盖touchesBegan/touchesMove/touchesEnd 方法,所以我添加了一个UILongPressGestureRecognizer 并将最小持续时间设置为0。但是,在我添加它之后,UIScrollView 不起作用,因为所有的触摸手势都被UILongPressGestureRecognizer 捕获。所以,我想知道有什么方法可以将手势从UILongPressGestureRecognizer 传递到UIScrollView

【问题讨论】:

  • @Student 谢谢。我确切地知道如何使用 UILongPressGestureRecognizer。但是问题是我在使用的时候,子视图中的scrollView无法接收到touches事件。

标签: ios objective-c cocoa-touch


【解决方案1】:

您可以使用UIGestureRecognizerrequireGestureRecognizerToFail 方法来创建手势之间的依赖关系。

UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressedDetected:)];
[longPress setMinimumPressDuration:0];
// longPress is only recognised if all the gesture in _scrollView fail
for (UIGestureRecognizer* recognizer in _scrollView.gestureRecognizers ) {
    [longPress requireGestureRecognizerToFail:recognizer];
}
[self.view addGestureRecognizer:longPress];

【讨论】:

    【解决方案2】:

    这是因为 scrollView 是您添加手势识别器的视图的子视图。因此,带有手势的视图将窃取其所有子视图的所有触摸。尝试设置手势视图和滚动视图处于同一级别。

    喜欢:

            RootView
               |
        ----------------
        |              |
    ScrollView - GestureView 
    

    对不起,糟糕的图表。

    编辑

    要以编程方式滚动一个,同时用手指滚动另一个,您可以利用两个组件的 scrollView 继承并实现 scrollViewDidScroll

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        // if user drags tableView we programmatically scroll collectionView and vice versa
        UIScrollView *toScroll = scrollView == tableView ? collectionView : tableView;
        // set the toScroll content offset equal to the one being dragged.
        toScroll.contentOffset = scrollView.contentOffset;
    }
    

    这将为您提供同时滚动的效果。

    希望对你有帮助。

    编辑 2

    看看这个 GitHub example

    您可能需要调整单元格的大小,以避免对于较小的滚动视图来说太过分。但这会给你一个良好的开端。

    【讨论】:

    • 感谢您的回答。但其实我想知道有没有什么办法可以将手势传递给scrollView。
    • 不明白你是想在scrollView上操作长手势还是想能够正常使用scrollView。
    • 哦,事实上,我处于一个更复杂的情况,我必须将 UIScrollView 与 UILongPressGestureRecognizer 结合使用。我只是在这个问题中简化它......
    • 如果你能更详细地概述情况和你需要什么。
    • 好的,谢谢。事实上,我在同一个屏幕上有一个表格视图和一个集合视图......而且我希望两个滚动视图同步滚动。所以我添加了手势识别器来手动处理它。
    【解决方案3】:

    将此添加到您的委托以允许它们都被处理

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        return YES;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多