UIScrollView嵌套的尝试

捕手项目的“发现”模块是基于一个UITableView来实现的,顶部是banner列表,有个tabBar作为tablesectionHeader,但是在底部其实是类似一个首页的横向滚动的多页ScrollView结构。

因为之前是用一个UITableView,所以每次切换下面的多页结构的时候,需要刷新UITableView,而且记录每个页面的滚动位置,即便做了数据缓存,其实这种结构是很消耗性能的,而且代码逻辑都混在一起(发现该类的代码已经达到了1050行╮(╯▽╰)╭),bug容易出现;考虑列表可以抽成ChildVC子页面来实现代码的分散,用横向滚动的UIScrollView放入tabBar所对应的ChildVC的tableView,这样就涉及到今天需要讨论的问题:在UIScrollView中嵌套UIScrollView

一种构思:在加载好mainScrollViewsubScrollView后,如果页面向上滚动,先滚动mainScrollView,等tabBar吸顶时候,mainScrollView停止滚动,subScrollView开始滚动。

这样涉及到mainScrollViewsubScrollView 在滚动或者拖拽时,代理方法ScrollViewDidScroll的监听判断问题,这里为了将逻辑代码分散开,我将subScrollView放在子控制器来管理。这样就监听需要两个UIScrollView在滚动的的偏移量ContentOffset,在临界点时候通知对方,这里使用通知NSNotification来实现通知。

结构简图如下:

UIScrollView

写了一个简单的测试项目,已放在Github上:FFScrollView

这是在做平时项目中遇到的一个问题的解决方式,希望各路大神拍砖指正。

总结

几大优点:

  1. 实现了代码的封装和分散,大大减少了主控制器的代码量,使得异味代码(累赘的判断逻辑)和出bug概率都减少了。
  2. 之前在切换各个tab对应的状态时,需要不停的刷新tableView,比较吃性能,而这种方式的实现,让每个tab对应数据都封装在自控制器中,这样也有减少了对服务端的请求,减少负担和出错的机会。
  3. 提高了自己解决问题的能力,优化了设计架构。

参考

  1. 嵌套UIScrollview的滑动冲突解决方案

  2. iOS 嵌套UIScrollview的滑动冲突另一种解决方案

文章作者: MichaelMao
文章链接: http://frizzlefur.com/2017/10/05/iOS_UIScrollView%E5%B5%8C%E5%A5%97%E7%9A%84%E5%B0%9D%E8%AF%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MMao
我要吐槽下