我有两个全屏孩子UICollectionViews
。一个是另一个透明的覆盖层。当我在屏幕上拖动时,我希望他们都能做出反应 - 当它是横向拖动时它们都是响应,而当它是垂直拖动时只有其中一个,有点像一些媒体中心主屏幕。这是否可以在不重新实现私人UICollectionView
手势识别器的情况下实现,如果是这样的话?
如果没有,那么任何指向示例重新实现的指针都将受到赞赏。
我知道或尝试过的一些事情:
我在视图控制器上有一个平移手势识别器,它有一个延迟开始,可以在事件发送到视图之前检测垂直或水平移动。
我知道只是从父视图的touchesBegan:
等转发事件将无效,因为触摸'视图属性设置为我的父视图,并且UITouches无法复制(至少天真)他们没有实施NSCopying协议。也许我可以合成合适的UITouch事件并转发它们?
我知道我可以手动发送scrollToItemAtIndexPath:atScrollPosition:animated:
条消息,但我更喜欢对集合进行自然的拖动,滑动和快照分页行为。
或者,是否可以修改私人手势识别器的代理并实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
- 无需显式访问私有API - 以允许两个集合都能看到触摸?响应者链是否足够智能,可以通过两个兄弟视图中的手势识别器来调用它?
另一种方法可能是手动控制叠加层,而不是将其作为集合视图进行管理,但集合视图看起来更自然,理论上提供了我想开箱即用的交互性。此刻,这个盒子似乎需要一根撬棍才能进入!
This question似乎相似(如果不那么明确),并且没有答案。我所看到的其他问题似乎都是关于添加捏,或者集合的子视图也响应手势;不是我的情况。
我有点挠头,所以感谢任何指示。
答案 0 :(得分:0)
简短的回答是你无论如何都不能轻易做到。
对我有用的方法更简单,更清晰:将一个集合视图嵌入到另一个集合视图中。包含一个限制为水平滚动,而覆盖一个限制为垂直,两者都打开了分页。两者共享与其委托和数据源相同的控制器,并且 - 由于集合视图是滚动视图的子类 - 这也跟踪我们在scrollViewDidEndDecelerating:
方法中使用的容器和覆盖页面:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if ([scrollView isEqual:containerCollection]) {
containerNumber = scrollView.contentOffset.x / scrollView.frame.size.width;
}
else {
overlayNumber = scrollView.contentOffset.y / scrollView.frame.size.height;
}
}
唯一真正的诡计是在我的cellForItemAtIndexPath:
方法中,当我实例化容器单元时,我需要注册.xibs以便重用(每个叠加层都不同)并使用记住的叠加页面并发出两者scrollToItemAtIndexPath:
和 reloadItemsAtIndexPaths:
到嵌入式叠加集合,以使其正确显示。
我设法将两个单元格保持为单独的.xibs,并为所需的任何额外数据提供相关的便利类(在容器集合的情况下,覆盖集合IBOutlet)。
并不是一个手势识别器。