iOS Swift 搭建分类联动商品列表

由于只是个Demo,所以用的是最简单的Cell来演示,VC里面只需要不到100行代码就可以实现。实际上在项目中的用法是差不多的,只是需要根据UI的设计,自定义Cell。


效果图

首先先在storyboard上面拖好界面,主要是两个tableView的位置放好,底下的购买按钮是凑数的。


image.png

把两个tableView拉到viewController里面


image.png

这里需要用到一个我自己封装的轻量级的TableViewManager框架,不需要实现tableView的代理方法,不然两个tableView的代理方法在一起处理,会让ViewController很臃肿。
剩下的代码:

class ViewController: UIViewController {
    /// 左侧分类的tableView
    @IBOutlet weak var categoryTableView: UITableView!
    /// 右侧商品的tableview
    @IBOutlet weak var productTableView: UITableView!
    var categoryManager: ZJTableViewManager!
    var productManager: ZJTableViewManager!
    //是否在向上滚动
    var isScrollUp:Bool = false
    var lastOffsetY:CGFloat = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //初始化tableviewManager
        self.categoryManager = ZJTableViewManager(tableView: self.categoryTableView)
        self.productManager = ZJTableViewManager(tableView: self.productTableView)
        self.productManager.delegate = self
        //假数据
        let arrCategory = ["分类1","分类2","分类3","分类4","分类5","分类6"]
        let arrProduct = ["面包", "蛋糕", "香蕉", "牛奶", "饼干", "猫粮"]
        //添加分类数据
        let categorySection = ZJTableViewSection()
        self.categoryManager?.add(section: categorySection)
        for category in arrCategory {
            let categoryItem = ZJTableViewItem(title: category)
            categoryItem.isAutoDeselect = false
            categorySection.add(item: categoryItem)
            //分类的点击事件
            categoryItem.setSelectionHandler(selectHandler: {[weak self] (item) in
                self?.productManager.tableView.scrollToRow(at: IndexPath(row: 0, section: item.indexPath.row), at: .top, animated: true)
            })
        }
        //添加商品数据
        for category in arrCategory {
            //添加分区标题
            let sectionHeader = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 40))
            sectionHeader.text = category
            sectionHeader.backgroundColor = UIColor.red
            let section = ZJTableViewSection(headerView: sectionHeader)
            self.productManager.add(section: section)
            //商品列表滑动时与分类列表联动
            section.setHeaderWillDisplayHandler({[weak self] (currentSection) in
                //手动拖才和左边联动
                if ((self?.productManager.tableView.isDragging)! && !(self?.isScrollUp)!){
                    let currentSection = self?.productTableView.indexPathsForVisibleRows?.first?.section ?? 0
                    self?.categoryTableView.selectRow(at: IndexPath(item: currentSection, section: 0), animated: false, scrollPosition: .middle)
                }
            })
            section.setHeaderDidEndDisplayHandler {[weak self] (currentSection) in
                //手动拖才和左边联动
                if ((self?.productManager.tableView.isDragging)! && (self?.isScrollUp)!){
                     self?.categoryTableView.selectRow(at: IndexPath(item: currentSection.index + 1, section: 0), animated: false, scrollPosition: .middle)
                }
            }
            //添加商品
            for product in arrProduct {
                let item = ZJTableViewItem(title: product)
                item.cellHeight = 90
                section.add(item: item)
            }
        }
        //先默认选中categoryTableView分类的第一个cell
        self.categoryTableView.selectRow(at: IndexPath(row: 0, section: 0), animated: true, scrollPosition: UITableView.ScrollPosition.top)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

extension ViewController:ZJTableViewDelegate{
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        isScrollUp = lastOffsetY < scrollView.contentOffset.y;
        lastOffsetY = scrollView.contentOffset.y;
    }
}

其实难点在于左边商品列表滑动时和右边分类的联动。
ViewController里面有两个属性,lastOffsetY用来记录productTableView上一刻的contentOffset.y的值,和此刻的做比较,判断是向上滑动还是向下滑动,赋值给isScrollUp

然后就是逻辑处理:
这里先理一下页面的逻辑。前提是必须是用户在手动滑动productTableView,假设productTableView当前显示的是分类3,向上滑动时,由于sectionHeader是悬浮的,那么分类3 header消失的时候,说明当前要显示分类3+1,此时左边分类触发显示分类4。向下滑动时,分类3 header向下走,分类2的header出现在顶部,此时此时左边分类触发显示分类2。
对这两种情况做处理:

//商品列表滑动时与分类列表联动
section.setHeaderWillDisplayHandler({[weak self] (currentSection) in
    //手动拖才和左边联动
    if ((self?.productManager.tableView.isDragging)! && !(self?.isScrollUp)!){
        let currentSection = self?.productTableView.indexPathsForVisibleRows?.first?.section ?? 0
        self?.categoryTableView.selectRow(at: IndexPath(item: currentSection, section: 0), animated: false, scrollPosition: .middle)
    }
})
section.setHeaderDidEndDisplayHandler {[weak self] (currentSection) in
    //手动拖才和左边联动
    if ((self?.productManager.tableView.isDragging)! && (self?.isScrollUp)!){
        self?.categoryTableView.selectRow(at: IndexPath(item: currentSection.index + 1, section: 0), animated: false, scrollPosition: .middle)
    }
}

Demo我放到TableViewManager的Demo2里面,感兴趣的话可以去看看,顺便帮忙star一下哈:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,945评论 4 60
  • 迎风去,画一副冷峻的脸庞。 是谁在话情殇? 是什么,荒芜了漫天的落花飞扬, 不敢看,不敢想, 回忆全都是你的模样。...
    小鱼伤感说说阅读 230评论 0 2
  • 初冬的暖阳,透过五彩秋叶洒下温暖的光线,辉映着亲水亭台的斑驳身影,映山湖畔枫叶树下看报喝茶的老无锡,二泉书院老人用...
    ZJGSLTY阅读 177评论 0 0