美文网首页
RYScrollView

RYScrollView

作者: YearRen | 来源:发表于2018-06-28 17:48 被阅读31次

    第一次写技术文,功能简单,文笔粗糙,凑活看看,如果能帮助到你,已经很高兴,欢迎反馈各种问题。

    仿汽车之家配置对比页面,先看一下效果

    就是图片而已

    接下来说一下思路吧,大体的思路大家应该都清楚,就是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中对横竖屏做了适配,横竖屏这里的话我就不说了,还在研究中如果有发现有任何问题,望指正

    相关文章

      网友评论

          本文标题:RYScrollView

          本文链接:https://www.haomeiwen.com/subject/sdqzjxtx.html