项目地址:ChainDroplist

最近项目中经常遇到 下拉/上拉列表(droplist) 的需求,共性比较多,但是会有细微的差异;首选当然是用UITableView,但是如果每个droplist都创建个datasourcedelegate未免也太麻烦了;索性抽出点时间封装了一个简单的链式Droplist,主要满足以下几种需求:

  • 使用 chain-style program(在一个方法里完成 droplist cell组装、展示、选择 的处理
  • 提供可选的 droplist hostview(并不是所有 dropilst 都直接简单粗暴的加载在 KeyWindow 上
  • 提供 可选的 tap rotation icon(点击、展示droplist应该伴随着icon的旋转,不是么?
  • 提供可选的 droplist baseView(droplist应该在点击view的下沿或者上沿进行伸展
  • 上方/下发 展示空间不足会主动调整展开方向(相信我,虽然用户不在意,但是总会我测试会提这个bug的
  • 默认展示5行,如果展示空间不足,自动**-1**直至可以满足展示条件(小屏用户的体验还是要考虑的)
  • Cell支持可最大化扩展,目前建议使用继承方式(你永远不知道下一个设计师能设计出来什么

先来看个简单的Sample:

再来看下使用方法,有个直观的印象:


- (void)showDroplist:(UIView *)baseView icon:(UIView *)icon hostView:(UIView *)hostView
{[[[[[ChainedDroplistView alloc] initWithConfig:^(ChainedDroplistView *droplist) {droplist.hostView = self.view; /* 展示droplist的父view,默认为Window */droplist.baseView = baseView; /* 用于确定 droplist 的 top/bottom */droplist.rotationView = icon; /* 展示droplist的同时做旋转的view */droplist.cellHeight = 60; /* 默认Cell height */droplist.datas = [self createTestDatas]; /* 创建 cell datas */}] registCustomerCellsWithConfig:^(UITableView *tableView) {/* 绑定 Cell Identifier */ [tableView registerClass:ChainedDroplistBaseCell.class forCellReuseIdentifier:kChainedDroplistBaseCellIdentifier];}] show] /* 调用 show 之后会执行展示动画 */processAfterSelected:^(NSInteger index) {/* 用户选中某个 Cell 后会执行该 block */NSLog(@"U have selected index -> [%@]", @(index));}];}复制代码

代码结构

基于UITableView封装,通过 ChainedDroplistModelProtocolChainedDroplistCellProtocol 来衔接 Cell 和 Model

ChainedDroplistModelProtocol
  • 提供 registerClass:forCellReuseIdentifier: 的 identifier
  • 可以直接继承 ChainedDroplistBaseModel,重写 - (NSString *)strCellIdentifier 方法提供自定义 identifier
Cell
  • configCellWithModel: 在每个 tableView: cellForRowAtIndexPath: 方法中都会调用,该方法中可以根据model更新Cell

关键代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{NSInteger index = indexPath.row;NSAssert(index < self.cellDatas.count, @"index[%@] beyonds the max count[%@] of datas", @(index), @(self.cellDatas.count));// 根据 ChainedDroplistModelProtocol strCellIdentifier 获取指定Cellid<ChainedDroplistModelProtocol> model = self.cellDatas[index];UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:model.strCellIdentifier];NSAssert([cell conformsToProtocol:@protocol(ChainedDroplistCellProtocol)],@"cell[%@] from identifier[%@] must conforms protocol [%@]",cell, model.strCellIdentifier, NSStringFromProtocol(@protocol(ChainedDroplistCellProtocol)));UITableViewCell <ChainedDroplistCellProtocol> * droplistCell = (UITableViewCell <ChainedDroplistCellProtocol> *)cell;if ([droplistCell respondsToSelector:@selector(configCellWithModel:)]) {// 刷新Cell[droplistCell configCellWithModel:model];}return droplistCell;
}
复制代码
  • ChainedDroplistBaseCellinitWithStyle: reuseIdentifier:调用了 setupUIsetupConstraints用于设置UI和约束, 可以直接继承 ChainedDroplistBaseCell,重写 setupUI setupConstraints 完成 Customer cell 的定义
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];if (self) {self.selectionStyle = UITableViewCellSelectionStyleNone;[self setupUI];[self setupConstraints];}return self;
}
复制代码

identifier 的声明和定义

  • 在Model中利用 FOUNDATION_EXPORT NSString *const identifier 声明identifier
  • 在Cell中定义相关 identifier: NSString *const identifier=@"identifier"

这么做只是为了通过简单的 identifier 搜索就可以找出 cell 和对应的 model

Sample

想了解的同学可以参考示例中的使用方法

  1. cd Example/
  2. run pod install
  3. open ChainedDroplist.xcworkspace/

为了尽可能说明ChainDroplist的设计初衷,示例中列举了比较详细的使用场景,包括:

  1. 默认场景:向下展开,默认5行可见
  2. 向下展示空间不足:根据 hostViewbaseViewcellHeght 来计算可视空间,如果下方空间不足会改为向上展示
  3. rotationView用于在展开droplist时做同步旋转
  4. 如果 上方、下方 空间均不足以展示5行,主动计算最少可展示行数并展示
  5. 通过继承 ChainedDroplistBaseCellChainedDroplistBaseModel 来实现自定义样式(虽然我不喜欢使用继承的方式,但是对于轻量的扩展场景是最适合不过的了

转载于:https://juejin.im/post/5cbc90c4f265da03ab232685

一款简单易用的链式droplist相关推荐

  1. focusky怎么制作html5,一款简单易上手的3D动态PPT制作软件Focusky

    原标题:一款简单易上手的3D动态PPT制作软件Focusky Focusky动画演示大师 是一款傻瓜式的动画宣传片.微课.3D 动态 PPT 制作工具.通过缩放动作,让演示文档变成生动有趣的动画,制作 ...

  2. PHP文字转语音排号声音,PC端好用的文字转语音软件有哪些?三款简单易用的软件推荐给你!...

    在我们的日常生活中,语音和文字这两种沟通形式已经非常普遍的存在了,比如说开会时因为需要专注,所以用录音笔将开会的内容录制下来,会后再通过文字语音转换软件来进行内容的转换,最后整理成领导想要的文字形式的 ...

  3. 推荐一款简单易用线上引流测试工具:GoReplay

    一. 引流测试产生背景 日常大部分的测试工作都是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能.在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致, ...

  4. 入手不亏,4款简单易用的典藏软件,真正的电脑利器

    作为一名搞机爱好者,电脑上总少不了各种千奇百怪的软件. 笔者今天,又给大家找到了,4款简单易用,入手不亏的典藏级别软件. 稻壳阅读器 稻壳阅读器,是一款非常厉害的多端应用阅读软件,原生支持Androi ...

  5. 一款简单易上手的ARM单片机开发IDE—STduino

    一款简单易上手的ARM单片机开发IDE-STduino 前言 STduino介绍 前言 第一眼看到这个IDE,第一反应就是名字有点像TrueSTUDIO,然后我上网查了一下,当然是没有关系的,只能说是 ...

  6. 会声会影 X3[是一款简单易用的视频编辑和光盘制作软件]

    会声会影 X3[是一款简单易用的视频编辑和光盘制作软件] 软件名称: 会声会影x3 简体中文版下载[易学易用的数字化影音创造] 软件大小: 511.00MB 软件语言: 简体中文 软件类别: 视频处理 ...

  7. (强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用、功能齐全的ERP软件

    (强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用.功能齐全的ERP软件 2BizBox是为全球制造业企业提供的一款简单易用.功能齐全的ERP软件. 功能完善 2BizBox是针 ...

  8. 快速上手!7款简单易用的在线绘图工具推荐

    随着科技的迅猛发展,越来越多的工作需要依赖电脑完成,而画图软件已经成为工作中不可或缺的一部分. 从过去简陋的Microsoft Paint到如今功能强大的Adobe Illustrator和即时设计等 ...

  9. 【ABTest】一款简单易用的ABTest开源库

    Github : https://github.com/TJHello/ABTest Gitee: https://gitee.com/TJHello/ABTest ABTest 一款简单易用的ABT ...

最新文章

  1. JSON WEB TOKEN
  2. MySQL中文全文索引
  3. input输入框修改placeholder和readonly的样式
  4. 取模除法(逆元)(费马小定理)(线性求逆元)
  5. 技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议
  6. 全向移动机器人参数校准方法思路
  7. 三星智能电视将用户语音隐私泄露给第三方?
  8. Window CE 驱动开发流程(Windows CE.5.0系统、pxa270平台)
  9. 如何做好一位合格qc_如何成为一名合格优秀的QC,你合格吗?
  10. Arcgis自带世界矢量图
  11. 高效办公必备神器-Keychron键盘,值得拥有
  12. 对赌协议里,隐藏了多少致命陷阱
  13. 零磁通电流探头的原理和特性是什么?
  14. sqlserver 日期与字符串之间的转换
  15. 虚拟机安装ubuntu怎么全屏_ubuntu虚拟机怎么设置全屏显示?
  16. 算法39-快速求次幂运算
  17. git、gitlab+jenkens版本控制的安装、升级与灾备
  18. 下载阿里云免费ssl证书
  19. 【报错总结】无法连接Hive的MetaStore数据库
  20. ig夺冠后服务器不稳定,因IG夺冠造成LOL国服在线火爆,出现服务器延迟卡顿情况...

热门文章

  1. 【2020年3月】自然语言处理最新论文速递
  2. mysql 超时异常_java.sql.SQLException:超出锁定等待超时;尝试在MYSQL中重启事务异常...
  3. 6个月火速炼成千亿参数大模型!背后是披荆斩棘的华为云哥哥们
  4. 10年卖下28家AI公司 苹果的AI吸星大法!
  5. 物品推荐系统中的挑战和解决方案
  6. 可解释性 or 准确性?AI 模型就一定不能两者兼得吗?
  7. 机器视觉学习笔记:BP神经网络详解
  8. SAP SD如何将销售订单其它ITEM加入到一个已创建好的交货单里
  9. 人工智能落地,商业化比技术更重要
  10. python读取文件夹下文件