ActionSheetPicker源码分析
前言
ActionSheetPicker可以快速生成UIPickerView+UIActionSheet的效果。效果如下👇
ActionSheetPicker代码结构
从github上将项目拷贝下来后,可以看到ActionSheetPicker的文件目录如下👇
ActionSheetPicker可以实现4种类型的picker:
- ActionSheetStringPicker
- ActionSheetDistancePicker
- ActionSheetDatePicker
- ActionSheetCustomPicker
这4种picker都是继承自AbstractActionSheetPicker。下面以ActionSheetStringPicker为例,来分析ActionSheetPicker的源码。
ActionSheetStringPicker使用示例
ActionSheetStringPicker的使用很简单,示例代码如下👇
1 | [ActionSheetStringPicker showPickerWithTitle:nil rows:@[@"男", @"女", @"未知"] initialSelection:1 doneBlock:^(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue) { |
效果如下👇
ActionSheetStringPicker实现过程
- 新建一个CGSize为(Screen_Width, 260)的UIView,这个view也是picker最外层的view,我们称它为
masterView
。 - 在masterView的最上方的44points区域内创建一个UIToolBar,我们称它为
toolBar
。在这个toolBar里面添加cancelButton
和doneButton
,以及这个picker的title
。(这里的title为空) - 执行
configuredPickerView
方法,这个方法必须在ActionSheetStringPicker.m
中重写。这个方法里面创建了一个UIPickerView,我们称它为pickerView
。这个pickerView占据了masterView下面的216points的空间。(注 : UIPickerViewDeledate 和 UIPickerViewDataSource 也在 ActionSheetStringPicker.m 里面实现。 - 实现ActionSheet的效果:在(SWActionSheet类中实现)。该类创建一个UIWindow,并将上面创建的masterView添加到该UIWindow的rootController的view的subview中,并显示该UIWindow。
ActionSheetStringPicker结构示意图
根据结构示意图可以知道:
- ActionSheetStringPicker新建了一个
UIWindow
,并且这个UIWindow遮挡住了默认的UIWindow(默认是在AppDelegate.m中声明) - UIWindow的rootController是一个
SWActionSheetVC
实例,这个SWActionSheetVC添加了一个SWActionSheet
视图 - SWActionSheet的subview是
masterView
- masterView分成2个部分:一个是上部的
UIToolBar
,另一个是下部的UIPickerView
ActionSheetStringPicker的重要几个文件(类)
- SWActionSheet.m
该文件实现了2个类,SWActionSheet
和SWActionSheetVC
。这两个类模仿了UIActionSheet的实现。他们创建了新的UIWindow,并将在AbstractActionSheetPicker.m中创建的masterView添加到视图中。
- AbstractActionSheetPicker.m
该文件实现了AbstractActionSheetPicker
类,这个类是创建4种不同类型的Picker的基类。在该类中创建了一个masterView
,并创建了masterView上部的UIToolBar
。
- ActionSheetStringPicker.m
该文件实现了ActionSheetStringPicker
类-4种这个库提供的picker之一。这个类最主要的功能就是实现了UIPickerView
,以及UIPickerView的一些所需的delegate。这里创建的UIPickerView
会被添加到masterView
的subview中。还有就是用户定义的doneBlock以及cancelBlock都会存储在这个类中。
参考
P.S
这个库是不能直接简单的实现下面的效果的👇
所以呢?
我写了一个ActionSheetStringDictPicker
类,用法如下👇
1 | [ActionSheetStringDictPicker showPickerWithTitle:nil firstRow:firstArray secondDict:secondDict initialIndexs:@[@1, @1] doneBlock:^(ActionSheetStringDictPicker *picker, NSArray *selectedIndexs, id selectedValues) { |
参数设置:
firstRow
: picker中第一列的内容,是一个NSArray
secondDict
: picker中第二列的内容,是一个NSDictionary
。这个NSDictionary的键是第一列firstRow的值;每个键对应的值是一个NSArray,这个数组是第二列的内容。当第一列的值变化时,第二列的内容会实时变化。
ActionSheetStringDictPicker的代码👉在这里👈