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