前言

ActionSheetPicker可以快速生成UIPickerView+UIActionSheet的效果。效果如下👇

action sheet demo

ActionSheetPicker代码结构

github上将项目拷贝下来后,可以看到ActionSheetPicker的文件目录如下👇

Action Sheet Picker Document

ActionSheetPicker可以实现4种类型的picker:

  1. ActionSheetStringPicker
  2. ActionSheetDistancePicker
  3. ActionSheetDatePicker
  4. ActionSheetCustomPicker

这4种picker都是继承自AbstractActionSheetPicker。下面以ActionSheetStringPicker为例,来分析ActionSheetPicker的源码。

ActionSheetStringPicker使用示例

ActionSheetStringPicker的使用很简单,示例代码如下👇

1
2
3
[ActionSheetStringPicker showPickerWithTitle:nil rows:@[@"男", @"女", @"未知"] initialSelection:1 doneBlock:^(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue) {

} cancelBlock:nil origin:self.view];

效果如下👇

stringPicker demo

ActionSheetStringPicker实现过程

  1. 新建一个CGSize为(Screen_Width, 260)的UIView,这个view也是picker最外层的view,我们称它为masterView
  2. 在masterView的最上方的44points区域内创建一个UIToolBar,我们称它为toolBar。在这个toolBar里面添加cancelButtondoneButton,以及这个picker的title。(这里的title为空)
  3. 执行configuredPickerView方法,这个方法必须在ActionSheetStringPicker.m中重写。这个方法里面创建了一个UIPickerView,我们称它为pickerView。这个pickerView占据了masterView下面的216points的空间。( : UIPickerViewDeledate 和 UIPickerViewDataSource 也在 ActionSheetStringPicker.m 里面实现。
  4. 实现ActionSheet的效果:在(SWActionSheet类中实现)。该类创建一个UIWindow,并将上面创建的masterView添加到该UIWindow的rootController的view的subview中,并显示该UIWindow。

ActionSheetStringPicker结构示意图

ActionSheetPicker

根据结构示意图可以知道:

  1. ActionSheetStringPicker新建了一个UIWindow,并且这个UIWindow遮挡住了默认的UIWindow(默认是在AppDelegate.m中声明)
  2. UIWindow的rootController是一个SWActionSheetVC实例,这个SWActionSheetVC添加了一个SWActionSheet视图
  3. SWActionSheet的subview是masterView
  4. masterView分成2个部分:一个是上部的UIToolBar,另一个是下部的UIPickerView

ActionSheetStringPicker的重要几个文件(类)

  1. SWActionSheet.m

该文件实现了2个类,SWActionSheetSWActionSheetVC。这两个类模仿了UIActionSheet的实现。他们创建了新的UIWindow,并将在AbstractActionSheetPicker.m中创建的masterView添加到视图中。

  1. AbstractActionSheetPicker.m

该文件实现了AbstractActionSheetPicker类,这个类是创建4种不同类型的Picker的基类。在该类中创建了一个masterView,并创建了masterView上部的UIToolBar

  1. ActionSheetStringPicker.m

该文件实现了ActionSheetStringPicker类-4种这个库提供的picker之一。这个类最主要的功能就是实现了UIPickerView,以及UIPickerView的一些所需的delegate。这里创建的UIPickerView会被添加到masterView的subview中。还有就是用户定义的doneBlock以及cancelBlock都会存储在这个类中。

参考

P.S

这个库是不能直接简单的实现下面的效果的👇

custom picker demo

所以呢?
我写了一个ActionSheetStringDictPicker类,用法如下👇

1
2
3
[ActionSheetStringDictPicker showPickerWithTitle:nil firstRow:firstArray secondDict:secondDict initialIndexs:@[@1, @1] doneBlock:^(ActionSheetStringDictPicker *picker, NSArray *selectedIndexs, id selectedValues) {
// do something here
} cancelBlock:nil origin:self.view];

参数设置:

  1. firstRow: picker中第一列的内容,是一个NSArray
  2. secondDict: picker中第二列的内容,是一个NSDictionary。这个NSDictionary的键是第一列firstRow的值;每个键对应的值是一个NSArray,这个数组是第二列的内容。当第一列的值变化时,第二列的内容会实时变化。

ActionSheetStringDictPicker的代码👉在这里👈