in工作写的一些组件

我写的一些组件

[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而实现

截图展示

RBAirSandbox

IMG_1412

IMG_1414

屏幕快照 2018-01-14 下午11.04.37