iOS - 嵌套ScrollViews并将手势传递给兄弟子视图

时间:2017-03-20 02:23:51

标签: ios objective-c swift uiscrollview

我有以下视图结构:

ScrollView A(水平)

  • ScrollView B(水平)
  • ViewC(集合视图)

ScrollView A在几周之间占据整个屏幕和页面,ScrollView B是A的子视图,并且还在几天之间占据整个屏幕和页面。 我们的想法是ScrollView B完全覆盖A,并处理所有分页,直到达到一周的开始或结束。此时,B无法滚动并进一步,所有分页然后自动被A捕获,然后按周分页。 这一切都很好“开箱即用”,但我有一个ViewC,它也是A的子视图(因此也被它分页),它“浮动”在scrollviewB上,因此不会随之滚动。

我的问题:ViewC是ScrollViewB的兄弟,而不是孩子,因此(即使相对于z-index ScrollViewB位于其下方)在其上完成的滑动手势也会传递给ScrollView A ...而我会喜欢将它们传递给ScrollView B。

我怎样才能做到这一点? 谢谢!

1 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但如果ViewC是一个静态信息视图,它真的需要成为ScrollViewA的子视图吗?

假设您的实现在没有ViewC的情况下工作(听起来应该如此),并且ViewC本身不需要任何交互,您应该只能使ViewC成为ScrollViewA的兄弟,并将所有触摸通过它传递给任何滚动视图目前根据您的逻辑处于活动状态。您可以通过继承UIView并覆盖-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event来返回NO。

来完成此操作

修改

鉴于静态视图确实有自己的交互,听起来你最好用子类UICollectionView替换ScrollViewB和ViewC。您可以将静态叠加层视图添加为子视图,并将其放在layoutSubviews中。

UICollectionView的另一个优点是您可以使用scrollToItemAtIndexPath:atScrollPosition:animated:滚动到特定项目。根据您对ViewC的实现情况,以及它在哪一天被点击过来,滚动到相应日期应该非常容易。

也就是说,听起来你已经把它全部工作了(除了叠加层),包括滚动到特定项目,所以你可能最好只是继承UISCrollView并将叠加层添加为子视图。这样您就可以重用所有现有逻辑,例如滚动到特定日期,并且应该修复滚动问题。