自定义的iOS的滚轮选择器,附带农历选择器实现

来源:互联网 发布:淘宝店被屏蔽了怎么办 编辑:程序博客网 时间:2024/05/17 23:49



本人由论坛会员beanwolf分享 这个控件并不是对iOS自带的UIPickerView贴图,而是重新实现,我一周多的成果,期间走了不少弯路。哈! 此控件 开发 的原因: 最近公司有个需求,需要做一个

本人由论坛会员beanwolf分享

这个控件并不是对iOS自带的UIPickerView贴图,而是重新实现,我一周多的成果,期间走了不少弯路。哈!

 

此控件开发的原因:
最近公司有个需求,需要做一个农历的日期滚轮选择器,一开始想用iOS自带的UIPickerView,但是设计人员要求的比较高,必须实现她要求的样式,也就是上图中大家看到的样式。但是UIPickerView根本没有提供可以定制样式(也就是更换皮肤)的接口。首先我在论坛上找到了帖子,按照这位兄台所述,确实可以在一定程度上修改UIPickerView的图片,我之所以说一定程度上,有以下几个原因:
(1.)他是用覆盖原有的UIPickerView上的各个子视图上图片的方法做的,那么你提供新的图片就必须与原图片严丝合缝。这也说明,即便是图片换了,样式也是不能换的,譬如:分割线的粗细、上下左右的边框的大小等,也就是不能完全DIY,不能满足我的需求。
(2.)由于覆盖UIPickerView上的各个子视图上图片的做法不是苹果官方给出的,一旦以后某个版本的UIPickerView实现策略改变,例如:3号子视图不再是滚轮的背景图片,你的做法就挂了。

于是我就实现了上图中的滚轮选择器,它与UIPickerView的区别是:
(1.)皮肤图片提供了方法可以做替换的。
(2.)可以选择滚轮上的数据是否循环滚动。
(3.)可以指定选择条的位置。


 为了代码的复用,也就是所谓的OOP,我按照以下的方式实现:
(1.)pickerview目录:这个目录中的IDJPickerView.h是滚轮选择器视图,没有任何和与数据相关的东西,也就是你可以在IDJPickerView上显示任何数据。IDJPickerView通过委托获取需要显示的数据。这个目录下的IDJScrollComponent.h实现了UIScrollView上的内容可以反复循环滚动的功能。
(2.)datepicker目录:IDJDatePickerView.h实现了IDJPickerView里的协议,并把IDJPickerView做为自己的一个私有成员,实现了一个可以根据type字段显示公历、农历的日期选择器,IDJDatePickerView.m里的农历算法用的是solar_chinese_calendar目录中的C++算法,因此农历的相关数据类使用了C++混编的代码。其实iOS自己支持农历的,但是存在BUG,具体的原因大家可以看我的IDJChineseCalendar.mm的源码,里面的注释比较详细的。我在这里也使用了一层封装,也就是IDJDatePickerView.m本身也不提供数据,而是通过IDJCalendar.h、IDJChineseCalendar.h、IDJCalendarUtil.h来提供,这样既实现了数据与视图的分离(因为农历算法太复杂了,直接写在IDJDatePickerView.m里会使得代码看起来可读性太差了),而且把C++的调用封装在了数据层,使得IDJDatePickerView.m的视图层代码不会出现C++的API。
(3.)timepicker目录:这个目录纯粹是一个Demo,展示了一个不循环滚动、显示行数与选中条位置不对称的选择器,没有什么实际的含义。

一开始我是纯粹写农历的选择器,代码都是耦合在一起的,后来逐个拆开的,这样代码就可以复用了,不仅仅是农历选择器,而是可以承载任何数据。

原文链接:http://www.cocoachina.com/bbs/read.php?tid=85374

源码:


原创粉丝点击