关于UIScrollView和UILongPressGesture

时间:2014-11-10 05:39:25

标签: ios objective-c cocoa-touch

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

3 个答案:

答案 0 :(得分:2)

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

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];

答案 1 :(得分:1)

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

像:

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

对不起的图表感到抱歉。

修改

要以编程方式滚动一个,同时用手指滚动另一个,您可以利用2个组件的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进行过多的操作。但这会给你一个良好的开端。

答案 2 :(得分:0)

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

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