【问题标题】:Can two UICollectionViews respond to a single gesture?两个 UICollectionView 可以响应一个手势吗?
【发布时间】:2014-04-28 10:15:00
【问题描述】:

我有两个全屏孩子UICollectionViews。一个是在另一个上的透明覆盖。当我在屏幕上拖动时,我希望它们都做出响应 - 当它是水平拖动时它们都响应,而当它是垂直拖动时只有它们一个,有点像一些媒体中心的主屏幕。如果不重新实现私有的UICollectionView 手势识别器,这是否可行,如果可以,如何实现?

如果没有,那么任何指向示例重新实现的指针都将不胜感激。

我知道或尝试过的一些事情:

我在 View Controller 上有一个带有延迟开始的平移手势识别器,它可以在事件发送到视图之前检测垂直或水平移动。

我知道简单地从我的父视图的touchesBegan: 等转发事件是行不通的,因为触摸的视图属性设置为我的父视图,并且 UITouches 不能被复制(至少天真),因为它们没有'不实现 NSCopying 协议。或许我可以合成合适的 UITouch 事件并转发?

我知道我可以手动发送scrollToItemAtIndexPath:atScrollPosition:animated: 消息,但我更喜欢收藏集的自然拖动、滑动和快照分页行为。

或者,是否可以修改私有手势识别器的委托并实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: - 无需显式访问私有 API - 以允许两个集合看到触摸?响应者链是否足够聪明,可以使用来自两个兄弟视图的手势识别器来调用它?

另一种方法可能是手动控制叠加层,而不是将其作为集合视图进行管理,但集合视图似乎更自然,理论上提供了我想要的开箱即用的交互性。这个盒子,目前看来需要撬棍才能进去!

This question 看起来很相似(如果不太明确的话),并且没有答案。我看过的其他问题似乎都是关于添加捏合,或者让集合的子视图也响应手势;不是我的情况。

我有点摸不着头脑,感谢您的指点。

【问题讨论】:

    标签: ios uicollectionview uigesturerecognizer


    【解决方案1】:

    简短的回答是,无论如何,你不能轻易做到。

    对我有用的方法更简单、更简洁:将一个集合视图嵌入到另一个集合视图中。包含一个限制为水平滚动,而覆盖一个限制为垂直滚动,两者都打开了分页。两者都与它们的委托和数据源共享相同的控制器,并且 - 由于集合视图是滚动视图的子类 - 这还可以跟踪我们在 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 以供重用(每个叠加层都不同)并使用记住的叠加层页面并同时发出 @987654324 @ reloadItemsAtIndexPaths: 到嵌入的覆盖集合以使其正确显示。

    我还设法将两个单元格保持为单独的 .xib,并为它们需要的任何额外数据提供关联的便利类(在容器集合的情况下,覆盖集合 IBOutlet)。

    而且看不到手势识别器。

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2013-01-04
      相关资源
      最近更新 更多