iOS常用列表

tableView嵌套tableView的功能实现

2021-02-21  本文已影响0人  孙国立

前言

以前公司做过一个tableView嵌套tableView滚动的功能实现。今天特意重新的整理了一下这个功能的实现。

功能需求说明:

具体实现

在说明实现方法之前先上一下现在的效果图

效果图.gif
功能实现部分
1.创建一个主控制器MainController

2.自定义tableViewCell
我这里要实现左右滑动切换tableView所以用到了一个ScrollView。如果没有多个标题的需求的话是不需要这个ScrollView的

至此页面的样式写完了。
这个时候运行程序的时候会发现上面的tableView和下面的tableView的滚动存在冲突

3.解决tableView嵌套滚动冲突的问题

import UIKit

class BaseTableView: UITableView , UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) && otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.self)
    }
}

4.实现丝滑滚动

我相信很多第一次接触这个功能的时候,很多人想到的方法是利用tableView的ScrollEnable属性来解决滚动冲突的问题千万不要这样做。千万不要这样做。千万不要这样做。一旦你这么做了的话,后果就是当你发现要切换两个视图的ScrollEnable属性的时候会出现明显的卡顿情况。
正确的做法应该是设置tableView的contentOffset的值

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //如果高度大于等于tableHeaderView的高度的时候
        if scrollView.contentOffset.y >=  HEADER_HEIGHT{
            //设置ContentOffsetY的高度为tableHeaderView的高度
            scrollView.contentOffset = CGPoint(x: 0, y: HEADER_HEIGHT)
            if self.canScroll {
                self.canScroll = false//设置是否可以滚动的参数为false
                //发送通知给子tableView。设置子tableView的可滚动属性为true
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ChilderNotice"), object: nil)
            }
        }else{
            if !self.canScroll {
                scrollView.contentOffset = CGPoint(x: 0, y: HEADER_HEIGHT)
            }
        }
    }
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //开始的时候子视图是无法滚动的  canScroll属性为false
        if !self.canScroll{
            scrollView.contentOffset = CGPoint.zero
        }
        //如果子视图的滚动高度小于等于0证明子视图滚动到了头部
        if scrollView.contentOffset.y <= 0 {
            self.canScroll = false
            //给主视图的tableView发送改变是否可以滚动的状态。让主视图的tbaleView可以滚动
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "mainNotice"), object: nil)
        }
    }

5.完整的代码下载地址

完整代码下载地址

6.感谢a1203302261提供的代码优化

效果图1.png 效果图2.png 效果图3.png

百度网盘:9vxh
github
此优化由简书用户@a1203302261提供。在此只做总结方便下载

上一篇 下一篇

猜你喜欢

热点阅读