第一次写技术文,功能简单,文笔粗糙,凑活看看,如果能帮助到你,已经很高兴,欢迎反馈各种问题。
仿汽车之家配置对比页面,先看一下效果
就是图片而已接下来说一下思路吧,大体的思路大家应该都清楚,就是ScrollView或者collectionView和tableview的嵌套
我用的是tableview+collectionView,在这里也需要感谢Hawk_Eleven的文章,我做的东西基本也是在他的基础上改的
不同的是,中间部分,我用了UICollectionView,因为考虑到复用的,我觉得能够复用肯定要更好一些。
下图部分就是控件的摆放了
红、蓝、绿红色部分是tableview,上下滚动
蓝色部分是collectionView,左右滚动。内部嵌套的tableview,上下滚动
绿色部分是collectionView,左右滚动
因为有组标题的缘故,红色部分是盖在蓝色部分上面的。
在写完UI这三大块控件之后,下面就是控制滚动的部分了
if (scrollView == self.listCollectionView) { //头部滚动 self.allCollectionView.contentOffset = scrollView.contentOffset; for (int i = 0; i < self.dataArray.count; i++) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; AllCollectionCell *cell = (AllCollectionCell *)[self.allCollectionView cellForItemAtIndexPath:indexPath]; cell.tableView.contentOffset = self.listTableView.contentOffset; } } else if (scrollView == self.listTableView) { //左侧滚动 self.listTableY = self.listTableView.contentOffset.y; for (int i = 0; i < self.dataArray.count; i++) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; AllCollectionCell *cell = (AllCollectionCell *)[self.allCollectionView cellForItemAtIndexPath:indexPath]; cell.tableView.contentOffset = self.listTableView.contentOffset; } } else if (scrollView == self.allCollectionView) { //内容容器滚动 self.listCollectionView.contentOffset = self.allCollectionView.contentOffset; } else { //内容item滚动 self.listTableView.contentOffset = scrollView.contentOffset; }
详解一下上面的代码
这段代码是在ScrollViewDidScroll中执行的,至于说什么原因就不需要我说了吧
手指触摸屏幕滚动有四部分,左侧列表、头部列表、中间的CollectionView、中间的Tableview
其中,中间部分的滚动和左侧上部的滚动是关联的,
也就是说,左侧的滚动与中间tableView的滚动是等价的,同理,上部的滚动和中间部分的collectionView也是等价的,所以,只要左侧和上不的滚动对应成功了,中间部分的就好说了
所以,上面的代码也就好理解了
有了上面的代码,一个同步滚动的效果就出来了,接下来就是一个填坑的工作了
上面的代码设置完成,如果工程中的tableviewRowHeight没有设置过的话(默认44),滚动是没有问题的,但是一旦设置了tableviewRowHeight,滚动的时候就会有问题了,这个问题困扰了我好久,以至于差点就放弃了,接下来是一个滚动错乱的图
乱了乱了这个不忍直视的滚动,我看了好久啊
后来也是偶然才修改了下tableview的estimatedRowHeight,改成和所设置的rowHeight一样的大小,问题解决了
好吧,解决了就想一想为什么呗
我猜想,tableview的预估高度被先加载,contentOffSet没有刷新到正确的位置,具体是为什么我也没有深究,如果有哪位大神知道的话,望指教
还有一个问题就是盖在上面的tableview和下面的collectionView的滑动问题,我在Hawk_Eleven的文章中找到的解决办法,那就是通过绘制的路径去判断手机触摸的点是否超过了绘制的路径,CGPathContainsPoint这个方法我不是特别了解,百度查了查,大概知道要绘制路径,我改了改Hawk_Eleven中路径绘制的方式,我直接监听了listTableView的contentSize属性,用这个属性绘制了路径,然后发现,瞎猫碰上了死耗子,同样,如果有大神了解的话评论区指导一下,不胜感激
解决了上面的坑,一个可上下左右滚动的视图基本也就完成了
Demo中对横竖屏做了适配,横竖屏这里的话我就不说了,还在研究中如果有发现有任何问题,望指正
网友评论