捕手项目的“发现”模块是基于一个
UITableView
来实现的,顶部是banner
列表,有个tabBar
作为table
的sectionHeader
,但是在底部其实是类似一个首页的横向滚动的多页ScrollView结构。
因为之前是用一个
UITableView
,所以每次切换下面的多页结构的时候,需要刷新UITableView
,而且记录每个页面的滚动位置,即便做了数据缓存,其实这种结构是很消耗性能的,而且代码逻辑都混在一起(发现该类的代码已经达到了1050行╮(╯▽╰)╭),bug
容易出现;考虑列表可以抽成ChildVC
子页面来实现代码的分散,用横向滚动的UIScrollView
放入tabBar所对应的ChildVC
的tableView,这样就涉及到今天需要讨论的问题:在UIScrollView
中嵌套UIScrollView
。
一种构思:在加载好mainScrollView
和subScrollView
后,如果页面向上滚动,先滚动mainScrollView
,等tabBar
吸顶时候,mainScrollView
停止滚动,subScrollView
开始滚动。
这样涉及到mainScrollView
和subScrollView
在滚动或者拖拽时,代理方法ScrollViewDidScroll
的监听判断问题,这里为了将逻辑代码分散开,我将subScrollView
放在子控制器来管理。这样就监听需要两个UIScrollView
在滚动的的偏移量ContentOffset
,在临界点时候通知对方,这里使用通知NSNotification
来实现通知。
结构简图如下:
写了一个简单的测试项目,已放在Github
上:FFScrollView
这是在做平时项目中遇到的一个问题的解决方式,希望各路大神拍砖指正。
总结
几大优点:
- 实现了代码的封装和分散,大大减少了主控制器的代码量,使得异味代码(累赘的判断逻辑)和出bug概率都减少了。
- 之前在切换各个tab对应的状态时,需要不停的刷新
tableView
,比较吃性能,而这种方式的实现,让每个tab对应数据都封装在自控制器中,这样也有减少了对服务端的请求,减少负担和出错的机会。 - 提高了自己解决问题的能力,优化了设计架构。