一款简单易用的链式droplist
项目地址:ChainDroplist
最近项目中经常遇到 下拉/上拉列表(droplist) 的需求,共性比较多,但是会有细微的差异;首选当然是用UITableView
,但是如果每个droplist都创建个datasource
,delegate
未免也太麻烦了;索性抽出点时间封装了一个简单的链式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
封装,通过 ChainedDroplistModelProtocol
和 ChainedDroplistCellProtocol
来衔接 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;
}
复制代码
ChainedDroplistBaseCell
中initWithStyle: reuseIdentifier:
调用了setupUI
、setupConstraints
用于设置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
想了解的同学可以参考示例中的使用方法
cd Example/
- run
pod install
open ChainedDroplist.xcworkspace/
为了尽可能说明ChainDroplist的设计初衷,示例中列举了比较详细的使用场景,包括:
- 默认场景:向下展开,默认5行可见
- 向下展示空间不足:根据
hostView
、baseView
、cellHeght
来计算可视空间,如果下方空间不足会改为向上展示 rotationView
用于在展开droplist时做同步旋转- 如果 上方、下方 空间均不足以展示5行,主动计算最少可展示行数并展示
- 通过继承
ChainedDroplistBaseCell
、ChainedDroplistBaseModel
来实现自定义样式(虽然我不喜欢使用继承的方式,但是对于轻量的扩展场景是最适合不过的了)
转载于:https://juejin.im/post/5cbc90c4f265da03ab232685
一款简单易用的链式droplist相关推荐
- focusky怎么制作html5,一款简单易上手的3D动态PPT制作软件Focusky
原标题:一款简单易上手的3D动态PPT制作软件Focusky Focusky动画演示大师 是一款傻瓜式的动画宣传片.微课.3D 动态 PPT 制作工具.通过缩放动作,让演示文档变成生动有趣的动画,制作 ...
- PHP文字转语音排号声音,PC端好用的文字转语音软件有哪些?三款简单易用的软件推荐给你!...
在我们的日常生活中,语音和文字这两种沟通形式已经非常普遍的存在了,比如说开会时因为需要专注,所以用录音笔将开会的内容录制下来,会后再通过文字语音转换软件来进行内容的转换,最后整理成领导想要的文字形式的 ...
- 推荐一款简单易用线上引流测试工具:GoReplay
一. 引流测试产生背景 日常大部分的测试工作都是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能.在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致, ...
- 入手不亏,4款简单易用的典藏软件,真正的电脑利器
作为一名搞机爱好者,电脑上总少不了各种千奇百怪的软件. 笔者今天,又给大家找到了,4款简单易用,入手不亏的典藏级别软件. 稻壳阅读器 稻壳阅读器,是一款非常厉害的多端应用阅读软件,原生支持Androi ...
- 一款简单易上手的ARM单片机开发IDE—STduino
一款简单易上手的ARM单片机开发IDE-STduino 前言 STduino介绍 前言 第一眼看到这个IDE,第一反应就是名字有点像TrueSTUDIO,然后我上网查了一下,当然是没有关系的,只能说是 ...
- 会声会影 X3[是一款简单易用的视频编辑和光盘制作软件]
会声会影 X3[是一款简单易用的视频编辑和光盘制作软件] 软件名称: 会声会影x3 简体中文版下载[易学易用的数字化影音创造] 软件大小: 511.00MB 软件语言: 简体中文 软件类别: 视频处理 ...
- (强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用、功能齐全的ERP软件
(强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用.功能齐全的ERP软件 2BizBox是为全球制造业企业提供的一款简单易用.功能齐全的ERP软件. 功能完善 2BizBox是针 ...
- 快速上手!7款简单易用的在线绘图工具推荐
随着科技的迅猛发展,越来越多的工作需要依赖电脑完成,而画图软件已经成为工作中不可或缺的一部分. 从过去简陋的Microsoft Paint到如今功能强大的Adobe Illustrator和即时设计等 ...
- 【ABTest】一款简单易用的ABTest开源库
Github : https://github.com/TJHello/ABTest Gitee: https://gitee.com/TJHello/ABTest ABTest 一款简单易用的ABT ...
最新文章
- JSON WEB TOKEN
- MySQL中文全文索引
- input输入框修改placeholder和readonly的样式
- 取模除法(逆元)(费马小定理)(线性求逆元)
- 技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议
- 全向移动机器人参数校准方法思路
- 三星智能电视将用户语音隐私泄露给第三方?
- Window CE 驱动开发流程(Windows CE.5.0系统、pxa270平台)
- 如何做好一位合格qc_如何成为一名合格优秀的QC,你合格吗?
- Arcgis自带世界矢量图
- 高效办公必备神器-Keychron键盘,值得拥有
- 对赌协议里,隐藏了多少致命陷阱
- 零磁通电流探头的原理和特性是什么?
- sqlserver 日期与字符串之间的转换
- 虚拟机安装ubuntu怎么全屏_ubuntu虚拟机怎么设置全屏显示?
- 算法39-快速求次幂运算
- git、gitlab+jenkens版本控制的安装、升级与灾备
- 下载阿里云免费ssl证书
- 【报错总结】无法连接Hive的MetaStore数据库
- ig夺冠后服务器不稳定,因IG夺冠造成LOL国服在线火爆,出现服务器延迟卡顿情况...
热门文章
- 【2020年3月】自然语言处理最新论文速递
- mysql 超时异常_java.sql.SQLException:超出锁定等待超时;尝试在MYSQL中重启事务异常...
- 6个月火速炼成千亿参数大模型!背后是披荆斩棘的华为云哥哥们
- 10年卖下28家AI公司 苹果的AI吸星大法!
- 物品推荐系统中的挑战和解决方案
- 可解释性 or 准确性?AI 模型就一定不能两者兼得吗?
- 机器视觉学习笔记:BP神经网络详解
- SAP SD如何将销售订单其它ITEM加入到一个已创建好的交货单里
- 人工智能落地,商业化比技术更重要
- python读取文件夹下文件