滚动发生时嵌套 UIScrollViews 并获取信息

Posted

技术标签:

【中文标题】滚动发生时嵌套 UIScrollViews 并获取信息【英文标题】:Nesting UIScrollViews and getting info, when the scrolling happened 【发布时间】:2011-08-23 16:00:40 【问题描述】:

我尝试阅读有关类似案例的其他问题,但没有运气,所以这里有一个问题。 我有一个嵌套 UIScrollView 的设置,虽然滚动一切正常,但我似乎没有任何委托事件。

外部 UIScrollView 分页并垂直滚动。在里面我有多个水平滚动的分页 UIScrollView 的“行”。现在,我想要的是在垂直滚动发生时将内部滚动条强制到特定位置。

我将 ViewController 设为委托并调用 scrollViewDidScroll,但它仅在我最初设置滚动条时触发,并且在我实际触摸设备并滚动网格时不会触发。

我正在监听内部和外部滚动条,当我在设备上滚动时它们都忽略触发任何事件。

我对 Obj-C 和 Cocoa 开发还很陌生,所以我可能完全遗漏了一些明显的东西,但感谢任何帮助。

【问题讨论】:

【参考方案1】:

我创建了一个小型测试项目,一切似乎都运行良好。确保在所有滚动视图上调用[scrollView setDelegate: self](假设控制器本身是委托。除此之外,始终确保滚动视图具有比它们的帧更大的contentSize,如果不是那么scrollDidScroll: 不应该触发完全没有。

我的小项目基本上有一个指向外部scrollView的指针和一个所有内部scrollViews的NSArray,每次外部滚动时(只是在scrollViewDidScroll:委托方法中进行了一次小检查)我只是递归地更改了所有内部scrollViews 的 contentOffsets 为CGPointMake(0.0, 0.0)

这不是最优化的方法,因为实际上只有以前可见的滚动视图需要重置(所有其他滚动视图无论如何都应该已经处于该偏移量)。另外,作为旁注,根据内部滚动视图的数量,这种将它们全部添加到外部滚动视图的方法可能会严重损害性能(应用程序需要将所有子视图都保存在内存中),因此您可能需要考虑重用滚动视图当前不可见的(Apple 示例项目 PhotoScroller 在 UIScrollView 中重用子视图有一些巧妙的技巧,它基本上模仿了 UITableView 的工作方式)。

如果您有任何其他问题,请告诉我,我会发布示例项目。

【讨论】:

谢谢,我确实做错了。我错过了 setDelegate 部分,现在一切似乎都很好。我最终使用了 scrollViewDidEndDecelrating,但这一点仍然有效。

以上是关于滚动发生时嵌套 UIScrollViews 并获取信息的主要内容,如果未能解决你的问题,请参考以下文章

具有水平滚动的嵌套 UIScrollViews

处理滚动嵌套 UIScrollViews 在同一方向滚动

嵌套 UIScrollViews 中的滚动问题

iOS嵌套的UIScrollViews没有响应

处理嵌套 UIScrollViews 中的冲突手势

iPhone - 嵌套 UIScrollViews 用于水平分页和垂直滚动