关于 UIScrollView 和 UILongPressGesture

Posted

技术标签:

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

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

【问题讨论】:

最佳答案***.com/questions/3319591/… @Student 谢谢。我确切地知道如何使用 UILongPressGestureRecognizer。但是问题是我在使用的时候,子视图中的scrollView无法接收到touches事件。 【参考方案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;

【讨论】:

以上是关于关于 UIScrollView 和 UILongPressGesture的主要内容,如果未能解决你的问题,请参考以下文章

关于在 UIScrollView 内滚动

苹果自己关于如何使用自动布局制作水平滚动 UIScrollView 的说明不起作用?

与 UIScrollView 和 setContentSize 混淆

iOS开发-UIScrollView原理

UIScrollView 不会自动调整大小

通过 UIScrollView 使用代码中的自动布局