美文网首页
iOS Swift 两个 TableView 联动

iOS Swift 两个 TableView 联动

作者: DeepMind11 | 来源:发表于2020-11-06 14:30 被阅读0次
    import UIKit
    
    class JLCascadeMenu: UIView {
    
        var leftArray: [String] = ["早餐时光", "营养粥", "特色点心", "佐餐小菜", "火锅", "冒菜", "巴奴毛肚", "外婆家", "李想大虾", "海底捞"]
        
        lazy var leftTableView: UITableView = {
            let tableView = UITableView()
            tableView.delegate = self
            tableView.dataSource = self
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
            return tableView
        }()
        
        lazy var rightTableView: UITableView = {
            let tableView = UITableView()
            tableView.delegate = self
            tableView.dataSource = self
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
            return tableView
        }()
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            // 默认选中左侧第一个, 不触发代理方法
            leftTableView.selectRow(at: IndexPath(row: 0, section: 0), animated: false, scrollPosition: .none)
            addSubview(leftTableView)
            addSubview(rightTableView)
            leftTableView.snp.makeConstraints { (make) in
                make.left.top.bottom.equalToSuperview()
                make.width.equalTo(JLScreen.width * 0.25)
            }
            rightTableView.snp.makeConstraints { (make) in
                make.right.top.bottom.equalToSuperview()
                make.left.equalTo(leftTableView.snp.right)
            }
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    extension JLCascadeMenu: UITableViewDelegate, UITableViewDataSource {
        
        func numberOfSections(in tableView: UITableView) -> Int {
            if tableView == leftTableView {
                return 1
            }
            return leftArray.count
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if tableView == leftTableView {
                return leftArray.count
            }
            return 5
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            if tableView == leftTableView {
                cell.selectionStyle = .blue
                cell.textLabel?.text = leftArray[indexPath.row]
            } else {
                cell.selectionStyle = .none
                cell.textLabel?.text = "\(indexPath.row)"
            }
            return cell
        }
        
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            if tableView == leftTableView {
                rightTableView.scrollToRow(at: IndexPath(row: 0, section: indexPath.row), at: .top, animated: true)
            } else {
                
            }
        }
        
        func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
            if tableView == rightTableView {
                return 30
            }
            return 0
        }
        
        func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            if tableView == rightTableView {
                let header = UIView()
                header.backgroundColor = .white
                let label = UILabel()
                label.text = leftArray[section]
                header.addSubview(label)
                label.snp.makeConstraints { (make) in
                    make.left.equalTo(15)
                    make.right.equalTo(-15)
                    make.top.bottom.equalToSuperview()
                }
                return header
            }
            return nil
        }
        
        
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            // 右侧tableView滚动时, 左侧tableView滚动到相应 Row
            if scrollView == rightTableView {
                // 只有用户拖拽才触发, 点击左侧不触发
                if scrollView.isDragging || scrollView.isTracking || scrollView.isDecelerating {
                    if let topIndexPath = self.rightTableView.indexPathsForVisibleRows?.first {
                        let moveToIndexPath = IndexPath(row: topIndexPath.section, section: 0)
                        self.leftTableView.selectRow(at: moveToIndexPath, animated: true, scrollPosition: .middle)
                    }
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS Swift 两个 TableView 联动

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