关于 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】:您可以使用UIGestureRecognizer
的requireGestureRecognizerToFail
方法来创建手势之间的依赖关系。
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 的说明不起作用?