我写的一些组件
[TOC]
RBAirSandbox - 沙盒展示组件
基于开源库RBAirSandbox
- 添加了长按压缩文件夹发送到Mac功能
- 添加了图片浏览、文本浏览
- 计划添加更多功能
INPopKit - 弹窗组件
INPopKit
是一套弹窗框架,程序中所有使用弹窗的地方,理论上都应该使用INPopKit
,也能够使用INPopKit
来显示所有的自定义弹窗,自定义你需要的View、遮挡级别、StatusBar的颜色等。你也可以自定义出现的动画和动画时间。
- 通过协议、继承、抽象类使得整个框架非常灵活,容易定制
- 可以选择使用模糊背景,或者灰色背景
- 自由使用出现、消失的动画,包含但不局限于飞入、飞出、抖动、缩放、渐变
- 自由使用window或者UIView的形式显示弹窗
- 定制顶部信号条StautsBar的显示颜色
- 自由选择使用AutoLayout或者Frame布局
- 连续出现多个弹窗的情况,可以在不改变背景的情况下依次弹出
- 框架内部处理键盘弹出时自动上移的操作
- 可以控制点击外部自动隐藏功能
- 抽象类功能强大,可以处理绝大多数从底部弹出的弹窗业务,比如分享菜单,列表选择等
可以从in app中找到INPopKit的使用例子:
- 列表选择:发图->继续->点击关闭
- 居中弹窗:in记->选择图片->右上角更多->点击删除
- 分享弹窗:in记->选择图片->右上角更多
- 处理键盘:关注->更多->举报->其他
INImageView - 图片显示组件
设计目标:app中所有显示图片的地方都是用这个组件
为什么:组件可以优化性能,包括处理圆角,缩放,gif播放,frame帧播放,手势处理(单机,双击),标签处理,网络下载和本地加载,webp处理,下载进度,失败placehold,
INGifView - Gif展示组件
- 封面图显示
- 下载进度展示
- 加载本地或者网络gif图片
- 指定播放帧
- 暂停和恢复播放
- 重新播放功能
INVideoView - 视频播放器
实现了一套和业务无关的视频播放组件,基础播放组件INVideoView不包含任何控件,所有业务处理逻辑由依附于INVideoView之上的一个我称之为XXControlView的subview提供,所有的代理也会给XXControlView。这样就实现了完全解耦,播放也展示分离。
实现了一套缓存逻辑,包含两部分,一部分处理AVPlayer,另一部分实现了本地的缓存逻辑和缓存策略。
- JYVideoPlayerView 是跟业务无关的播放器,INVideoView是跟业务有关的播放器
- 播放本地或者网络视频,提供基本功能,比如播放,暂停,获取视频长度和视频size
- 缓存已经播放过的视频
- 精细的缓存管理策略,比如获取缓存大小、控制最大缓存限制、清除老旧文件、根据URL来获取视频源文件、根据URL来清除视频文件等等
- 控制系统音量调节的显示,因为系统音量视图会挡住视频内容,所以INVideoView在播放的时候可以选择自定义音量显示方式
- 插拔耳机暂停和恢复播放
- 程序前后台暂停和恢复播放
- 全屏播放功能
具体代码可以参见开源库https://github.com/irobbin/OTPlayerCache
INSlideView - 小in片轮播组件
类似于幻灯片播放,有两种样式。
第一种:缩放、移动、渐变混合
第二种:快速变换预览
小in片的动画看似简单,实则逻辑复杂,所有的逻辑都封装在INSlideView中,只需要传递图片和播放方式即可。
- 首先播放暂停和视频一样,推到后台和回到前台需要暂停播放
- 滑动列表需要暂停播放,手指移开继续播放
- 先下载所有的图片,才会开始播放。第一张图片优先下载,然后先显示到View中
- 有下载进度显示功能,此时会有灰色朦层显示,用户无法操作
- 滑动距离和速度计算较为复杂,还有上下左右的动画不能连续执行,比如上次是向左,下一张必须是向右
- INSlideView提供清空内存功能,用来清除不用的图片,释放内存
- 使用POP做动画
- INSlideView代码行数高达1015行
INOption - 测试菜单组件
这是一个内部使用的组件,主要用来提供测试菜单项目,例如
- CPU、内存、网络信息
- 服务器类型选择,QA或者线上
- LogCatcher的服务器地址
- 清除App的所有缓存,用来初始化App,而不需要重新安装
- 请求是否需要开启加密
- 重新登录别的账号
- 添加网络请求的额外参数
- 可以自由接入其他测试菜单项
- 与此配合使用的是一个Mac软件,LogCatcher
LogCatcher - Mac端Log抓取App
LogCatcher的主要作用是抓埋点和Socket通信,因为这两项在Charles中都比较难以抓取。
除此之外LogCatcher也可以抓取所有经过INLogSocketManager发送的分级Log信息,且可以在LogCatcher中进行简单过滤,是一个非常好用的小工具。
INLogSocketManager是一个分级的、封装的很好的Log系统,不过暂时只和LogCatcher进行协议配合。
INFlowLayoutView - 横排组件
一个横向布局组件,类似UICollectionView,但是比UICollectionView轻量级,和业务相关。
实现的功能是所有的subView会像写字一样从左往右依次排开,不够显示的换行。
可以在in,路径 发图->…->保存页面->话题选择(#号按钮)->热门话题下面找到
实现细节:
主要是计算,有一个二维数组linesData保存每一行,每一行中有若干个view信息,根据这个二维数组可以计算得出INFlowLayoutView的宽高,每一行中的每一个元素都保存着view,和frame,有了这些信息就可以把所有的view布局出来。
计算规则:计算行内元素的时候使用最大吞并原则,先把当前元素加进来,然后计算此元素的frame,如果frame超过了宽度限制,那么另起一行,for循环倒退一个元素
INLineLayoutView - 单排组件
这是一个横向布局组件,API简单,只需要简单往里面添加View,那么就可以将所有的subView居中显示
原理:复写addSubview方法,每添加进来一个元素,会重新进行居中布局,当然你需要设置间距属性margin
INPhotoLayoutView - 图片布局组件
INPhotoLayoutView组件主要是为了应付产品上多变的图片布局形式而创造的。
理论上INPhotoLayoutView可以应对所有的图片布局
实现原理是调用者提供一个布局类INPhotoLayoutModel过来,这个类提供了每张图片的frame,和布局的高度,这样INPhotoLayoutView就可以根据这些信息来精确布局
INPickerView - 选择组件
这是最近在同城趴App中写的一个组件。属于对UIPickerView的封装,使其更加易于使用和符合同城趴的UI设计标准。
主要功能有:
- 日期选择
- 男女选择(可扩展为列表选择,自定义列表项目)
- INLocationPickerView省市区选择组件通过子类化INPickerView而实现