BRAddressPickerView.m 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. //
  2. // BRAddressPickerView.m
  3. // BRPickerViewDemo
  4. //
  5. // Created by renbo on 2017/8/11.
  6. // Copyright © 2017 irenb. All rights reserved.
  7. //
  8. // 最新代码下载地址:https://github.com/91renb/BRPickerView
  9. #import "BRAddressPickerView.h"
  10. #import "NSBundle+BRPickerView.h"
  11. @interface BRAddressPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
  12. // 地址选择器
  13. @property (nonatomic, strong) UIPickerView *pickerView;
  14. // 省模型数组
  15. @property(nonatomic, copy) NSArray *provinceModelArr;
  16. // 市模型数组
  17. @property(nonatomic, copy) NSArray *cityModelArr;
  18. // 区模型数组
  19. @property(nonatomic, copy) NSArray *areaModelArr;
  20. // 选中的省
  21. @property(nonatomic, strong) BRProvinceModel *selectProvinceModel;
  22. // 选中的市
  23. @property(nonatomic, strong) BRCityModel *selectCityModel;
  24. // 选中的区
  25. @property(nonatomic, strong) BRAreaModel *selectAreaModel;
  26. // 记录省选中的位置
  27. @property(nonatomic, assign) NSInteger provinceIndex;
  28. // 记录市选中的位置
  29. @property(nonatomic, assign) NSInteger cityIndex;
  30. // 记录区选中的位置
  31. @property(nonatomic, assign) NSInteger areaIndex;
  32. @property (nonatomic, copy) NSArray <NSString *>* mSelectValues;
  33. @end
  34. @implementation BRAddressPickerView
  35. #pragma mark - 1.显示地址选择器
  36. + (void)showAddressPickerWithSelectIndexs:(NSArray <NSNumber *>*)selectIndexs
  37. resultBlock:(BRAddressResultBlock)resultBlock {
  38. [self showAddressPickerWithMode:BRAddressPickerModeArea dataSource:nil selectIndexs:selectIndexs isAutoSelect:NO resultBlock:resultBlock];
  39. }
  40. #pragma mark - 2.显示地址选择器
  41. + (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
  42. selectIndexs:(NSArray <NSNumber *>*)selectIndexs
  43. isAutoSelect:(BOOL)isAutoSelect
  44. resultBlock:(BRAddressResultBlock)resultBlock {
  45. [self showAddressPickerWithMode:mode dataSource:nil selectIndexs:selectIndexs isAutoSelect:isAutoSelect resultBlock:resultBlock];
  46. }
  47. #pragma mark - 3.显示地址选择器
  48. + (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
  49. dataSource:(NSArray *)dataSource
  50. selectIndexs:(NSArray <NSNumber *>*)selectIndexs
  51. isAutoSelect:(BOOL)isAutoSelect
  52. resultBlock:(BRAddressResultBlock)resultBlock {
  53. // 创建地址选择器
  54. BRAddressPickerView *addressPickerView = [[BRAddressPickerView alloc] initWithPickerMode:mode];
  55. addressPickerView.dataSourceArr = dataSource;
  56. addressPickerView.selectIndexs = selectIndexs;
  57. addressPickerView.isAutoSelect = isAutoSelect;
  58. addressPickerView.resultBlock = resultBlock;
  59. // 显示
  60. [addressPickerView show];
  61. }
  62. #pragma mark - 初始化地址选择器
  63. - (instancetype)initWithPickerMode:(BRAddressPickerMode)pickerMode {
  64. if (self = [super init]) {
  65. self.pickerMode = pickerMode;
  66. }
  67. return self;
  68. }
  69. #pragma mark - 处理选择器数据
  70. - (void)handlerPickerData {
  71. if (self.dataSourceArr && self.dataSourceArr.count > 0) {
  72. id item = [self.dataSourceArr firstObject];
  73. // 如果传的值是解析好的模型数组
  74. if ([item isKindOfClass:[BRProvinceModel class]]) {
  75. self.provinceModelArr = self.dataSourceArr;
  76. } else {
  77. self.provinceModelArr = [self getProvinceModelArr:self.dataSourceArr];
  78. }
  79. } else {
  80. // 如果外部没有传入地区数据源,就使用本地的数据源
  81. NSArray *dataSource = [NSBundle br_addressJsonArray];
  82. if (!dataSource || dataSource.count == 0) {
  83. return;
  84. }
  85. self.dataSourceArr = dataSource;
  86. self.provinceModelArr = [self getProvinceModelArr:self.dataSourceArr];
  87. }
  88. // 设置默认值
  89. [self handlerDefaultSelectValue];
  90. }
  91. #pragma mark - 获取模型数组
  92. - (NSArray <BRProvinceModel *>*)getProvinceModelArr:(NSArray *)dataSourceArr {
  93. NSMutableArray *tempArr1 = [NSMutableArray array];
  94. for (NSDictionary *proviceDic in dataSourceArr) {
  95. BRProvinceModel *proviceModel = [[BRProvinceModel alloc]init];
  96. proviceModel.code = [proviceDic objectForKey:@"code"];
  97. proviceModel.name = [proviceDic objectForKey:@"name"];
  98. proviceModel.index = [dataSourceArr indexOfObject:proviceDic];
  99. NSArray *cityList = [proviceDic.allKeys containsObject:@"cityList"] ? [proviceDic objectForKey:@"cityList"] : [proviceDic objectForKey:@"citylist"];
  100. NSMutableArray *tempArr2 = [NSMutableArray array];
  101. for (NSDictionary *cityDic in cityList) {
  102. BRCityModel *cityModel = [[BRCityModel alloc]init];
  103. cityModel.code = [cityDic objectForKey:@"code"];
  104. cityModel.name = [cityDic objectForKey:@"name"];
  105. cityModel.index = [cityList indexOfObject:cityDic];
  106. NSArray *areaList = [cityDic.allKeys containsObject:@"areaList"] ? [cityDic objectForKey:@"areaList"] : [cityDic objectForKey:@"arealist"];
  107. NSMutableArray *tempArr3 = [NSMutableArray array];
  108. for (NSDictionary *areaDic in areaList) {
  109. BRAreaModel *areaModel = [[BRAreaModel alloc]init];
  110. areaModel.code = [areaDic objectForKey:@"code"];
  111. areaModel.name = [areaDic objectForKey:@"name"];
  112. areaModel.index = [areaList indexOfObject:areaDic];
  113. [tempArr3 addObject:areaModel];
  114. }
  115. cityModel.arealist = [tempArr3 copy];
  116. [tempArr2 addObject:cityModel];
  117. }
  118. proviceModel.citylist = [tempArr2 copy];
  119. [tempArr1 addObject:proviceModel];
  120. }
  121. return [tempArr1 copy];
  122. }
  123. #pragma mark - 设置默认选择的值
  124. - (void)handlerDefaultSelectValue {
  125. __block NSString *selectProvinceName = nil;
  126. __block NSString *selectCityName = nil;
  127. __block NSString *selectAreaName = nil;
  128. if (self.mSelectValues.count > 0) {
  129. selectProvinceName = self.mSelectValues.count > 0 ? self.mSelectValues[0] : nil;
  130. selectCityName = self.mSelectValues.count > 1 ? self.mSelectValues[1] : nil;
  131. selectAreaName = self.mSelectValues.count > 2 ? self.mSelectValues[2] : nil;
  132. }
  133. if (self.pickerMode == BRAddressPickerModeProvince || self.pickerMode == BRAddressPickerModeCity || self.pickerMode == BRAddressPickerModeArea) {
  134. if (self.selectIndexs.count > 0) {
  135. NSInteger provinceIndex = [self.selectIndexs[0] integerValue];
  136. self.provinceIndex = (provinceIndex > 0 && provinceIndex < self.provinceModelArr.count) ? provinceIndex : 0;
  137. self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
  138. } else {
  139. self.provinceIndex = 0;
  140. self.selectProvinceModel = self.provinceModelArr.count > 0 ? self.provinceModelArr[0] : nil;
  141. @weakify(self)
  142. [self.provinceModelArr enumerateObjectsUsingBlock:^(BRProvinceModel * _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
  143. @strongify(self)
  144. if (selectProvinceName && [model.name isEqualToString:selectProvinceName]) {
  145. self.provinceIndex = idx;
  146. self.selectProvinceModel = model;
  147. *stop = YES;
  148. }
  149. }];
  150. }
  151. }
  152. if (self.pickerMode == BRAddressPickerModeCity || self.pickerMode == BRAddressPickerModeArea) {
  153. self.cityModelArr = [self getCityModelArray:self.provinceIndex];
  154. if (self.selectIndexs.count > 0) {
  155. NSInteger cityIndex = self.selectIndexs.count > 1 ? [self.selectIndexs[1] integerValue] : 0;
  156. self.cityIndex = (cityIndex > 0 && cityIndex < self.cityModelArr.count) ? cityIndex : 0;
  157. self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
  158. } else {
  159. self.cityIndex = 0;
  160. self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
  161. @weakify(self)
  162. [self.cityModelArr enumerateObjectsUsingBlock:^(BRCityModel * _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
  163. @strongify(self)
  164. if (selectCityName && [model.name isEqualToString:selectCityName]) {
  165. self.cityIndex = idx;
  166. self.selectCityModel = model;
  167. *stop = YES;
  168. }
  169. }];
  170. }
  171. }
  172. if (self.pickerMode == BRAddressPickerModeArea) {
  173. self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:self.cityIndex];
  174. if (self.selectIndexs.count > 0) {
  175. NSInteger areaIndex = self.selectIndexs.count > 2 ? [self.selectIndexs[2] integerValue] : 0;
  176. self.areaIndex = (areaIndex > 0 && areaIndex < self.areaModelArr.count) ? areaIndex : 0;
  177. self.selectAreaModel = self.areaModelArr.count > self.areaIndex ? self.areaModelArr[self.areaIndex] : nil;
  178. } else {
  179. self.areaIndex = 0;
  180. self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
  181. @weakify(self)
  182. [self.areaModelArr enumerateObjectsUsingBlock:^(BRAreaModel * _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
  183. @strongify(self)
  184. if (selectAreaName && [model.name isEqualToString:selectAreaName]) {
  185. self.areaIndex = idx;
  186. self.selectAreaModel = model;
  187. *stop = YES;
  188. }
  189. }];
  190. }
  191. }
  192. }
  193. // 根据 省索引 获取 城市模型数组
  194. - (NSArray *)getCityModelArray:(NSInteger)provinceIndex {
  195. BRProvinceModel *provinceModel = self.provinceModelArr[provinceIndex];
  196. // 返回城市模型数组
  197. return provinceModel.citylist;
  198. }
  199. // 根据 省索引和城市索引 获取 区域模型数组
  200. - (NSArray *)getAreaModelArray:(NSInteger)provinceIndex cityIndex:(NSInteger)cityIndex {
  201. BRProvinceModel *provinceModel = self.provinceModelArr[provinceIndex];
  202. if (provinceModel.citylist && provinceModel.citylist.count > 0) {
  203. BRCityModel *cityModel = provinceModel.citylist[cityIndex];
  204. // 返回地区模型数组
  205. return cityModel.arealist;
  206. } else {
  207. return nil;
  208. }
  209. }
  210. #pragma mark - 地址选择器
  211. - (UIPickerView *)pickerView {
  212. if (!_pickerView) {
  213. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  214. _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
  215. _pickerView.backgroundColor = self.pickerStyle.pickerColor;
  216. _pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
  217. _pickerView.dataSource = self;
  218. _pickerView.delegate = self;
  219. }
  220. return _pickerView;
  221. }
  222. #pragma mark - UIPickerViewDataSource
  223. // 1.设置 pickerView 的列数
  224. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
  225. switch (self.pickerMode) {
  226. case BRAddressPickerModeProvince:
  227. return 1;
  228. break;
  229. case BRAddressPickerModeCity:
  230. return 2;
  231. break;
  232. case BRAddressPickerModeArea:
  233. return 3;
  234. break;
  235. default:
  236. break;
  237. }
  238. }
  239. // 2.设置 pickerView 每列的行数
  240. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  241. if (component == 0) {
  242. // 返回省个数
  243. return self.provinceModelArr.count;
  244. }
  245. if (component == 1) {
  246. // 返回市个数
  247. return self.cityModelArr.count;
  248. }
  249. if (component == 2) {
  250. // 返回区个数
  251. return self.areaModelArr.count;
  252. }
  253. return 0;
  254. }
  255. #pragma mark - UIPickerViewDelegate
  256. // 3.设置 pickerView 的显示内容
  257. - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
  258. // 1.自定义 row 的内容视图
  259. UILabel *label = (UILabel *)view;
  260. if (!label) {
  261. label = [[UILabel alloc]init];
  262. label.backgroundColor = [UIColor clearColor];
  263. label.textAlignment = NSTextAlignmentCenter;
  264. label.font = self.pickerStyle.pickerTextFont;
  265. label.textColor = self.pickerStyle.pickerTextColor;
  266. // 字体自适应属性
  267. label.adjustsFontSizeToFitWidth = YES;
  268. // 自适应最小字体缩放比例
  269. label.minimumScaleFactor = 0.5f;
  270. }
  271. if (component == 0) {
  272. BRProvinceModel *model = self.provinceModelArr[row];
  273. label.text = model.name;
  274. } else if (component == 1) {
  275. BRCityModel *model = self.cityModelArr[row];
  276. label.text = model.name;
  277. } else if (component == 2) {
  278. BRAreaModel *model = self.areaModelArr[row];
  279. label.text = model.name;
  280. }
  281. // 2.设置选择器中间选中行的样式
  282. [self setPickerSelectRowStyle:pickerView titleForRow:row forComponent:component];
  283. return label;
  284. }
  285. #pragma mark - 设置选择器中间选中行的样式
  286. - (void)setPickerSelectRowStyle:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
  287. // 1.设置分割线的颜色
  288. for (UIView *subView in pickerView.subviews) {
  289. if (subView && [subView isKindOfClass:[UIView class]] && subView.frame.size.height <= 1) {
  290. subView.backgroundColor = self.pickerStyle.separatorColor;
  291. }
  292. }
  293. // 2.设置选择器中间选中行的背景颜色
  294. if (self.pickerStyle.selectRowColor) {
  295. UIView *contentView = nil;
  296. NSArray *subviews = pickerView.subviews;
  297. if (subviews.count > 0) {
  298. id obj = subviews.firstObject;
  299. if (obj && [obj isKindOfClass:[UIView class]]) {
  300. contentView = (UIView *)obj;
  301. }
  302. }
  303. UIView *columnView = nil;
  304. if (contentView) {
  305. id obj = [contentView valueForKey:@"subviewCache"];
  306. if (obj && [obj isKindOfClass:[NSArray class]]) {
  307. NSArray *columnViews = (NSArray *)obj;
  308. if (columnViews.count > 0) {
  309. id columnObj = columnViews.firstObject;
  310. if (columnObj && [columnObj isKindOfClass:[UIView class]]) {
  311. columnView = (UIView *)columnObj;
  312. }
  313. }
  314. }
  315. }
  316. if (columnView) {
  317. id obj = [columnView valueForKey:@"middleContainerView"];
  318. if (obj && [obj isKindOfClass:[UIView class]]) {
  319. UIView *selectRowView = (UIView *)obj;
  320. selectRowView.backgroundColor = self.pickerStyle.selectRowColor;
  321. }
  322. }
  323. }
  324. // 3.设置选择器中间选中行的字体颜色/字体大小
  325. if (self.pickerStyle.selectRowTextColor || self.pickerStyle.selectRowTextFont) {
  326. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  327. // 当前选中的 label
  328. UILabel *selectLabel = (UILabel *)[pickerView viewForRow:row forComponent:component];
  329. if (selectLabel) {
  330. if (self.pickerStyle.selectRowTextColor) {
  331. selectLabel.textColor = self.pickerStyle.selectRowTextColor;
  332. }
  333. if (self.pickerStyle.selectRowTextFont) {
  334. selectLabel.font = self.pickerStyle.selectRowTextFont;
  335. }
  336. }
  337. });
  338. }
  339. }
  340. // 4.滚动 pickerView 执行的回调方法
  341. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  342. if (component == 0) { // 选择省
  343. // 保存选择的省份的索引
  344. self.provinceIndex = row;
  345. switch (self.pickerMode) {
  346. case BRAddressPickerModeProvince:
  347. {
  348. self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
  349. self.selectCityModel = nil;
  350. self.selectAreaModel = nil;
  351. }
  352. break;
  353. case BRAddressPickerModeCity:
  354. {
  355. self.cityModelArr = [self getCityModelArray:self.provinceIndex];
  356. [self.pickerView reloadComponent:1];
  357. [self.pickerView selectRow:0 inComponent:1 animated:YES];
  358. self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
  359. self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
  360. self.selectAreaModel = nil;
  361. }
  362. break;
  363. case BRAddressPickerModeArea:
  364. {
  365. self.cityModelArr = [self getCityModelArray:self.provinceIndex];
  366. self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:0];
  367. [self.pickerView reloadComponent:1];
  368. [self.pickerView selectRow:0 inComponent:1 animated:YES];
  369. [self.pickerView reloadComponent:2];
  370. [self.pickerView selectRow:0 inComponent:2 animated:YES];
  371. self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
  372. self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
  373. self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
  374. }
  375. break;
  376. default:
  377. break;
  378. }
  379. }
  380. if (component == 1) { // 选择市
  381. // 保存选择的城市的索引
  382. self.cityIndex = row;
  383. switch (self.pickerMode) {
  384. case BRAddressPickerModeCity:
  385. {
  386. self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
  387. self.selectAreaModel = nil;
  388. }
  389. break;
  390. case BRAddressPickerModeArea:
  391. {
  392. self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:self.cityIndex];
  393. [self.pickerView reloadComponent:2];
  394. [self.pickerView selectRow:0 inComponent:2 animated:YES];
  395. self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
  396. self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
  397. }
  398. break;
  399. default:
  400. break;
  401. }
  402. }
  403. if (component == 2) { // 选择区
  404. // 保存选择的地区的索引
  405. self.areaIndex = row;
  406. if (self.pickerMode == BRAddressPickerModeArea) {
  407. self.selectAreaModel = self.areaModelArr.count > self.areaIndex ? self.areaModelArr[self.areaIndex] : nil;
  408. }
  409. }
  410. // 滚动选择时执行 changeBlock
  411. if (self.changeBlock) {
  412. self.changeBlock(self.selectProvinceModel, self.selectCityModel, self.selectAreaModel);
  413. }
  414. // 设置自动选择时,滚动选择时就执行 resultBlock
  415. if (self.isAutoSelect) {
  416. if (self.resultBlock) {
  417. self.resultBlock(self.selectProvinceModel, self.selectCityModel, self.selectAreaModel);
  418. }
  419. }
  420. }
  421. // 设置行高
  422. - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
  423. return self.pickerStyle.rowHeight;
  424. }
  425. #pragma mark - 重写父类方法
  426. - (void)reloadData {
  427. // 1.处理数据源
  428. [self handlerPickerData];
  429. // 2.刷新选择器
  430. [self.pickerView reloadAllComponents];
  431. // 3.滚动到选择的地区
  432. if (self.pickerMode == BRAddressPickerModeProvince) {
  433. [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
  434. } else if (self.pickerMode == BRAddressPickerModeCity) {
  435. [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
  436. [self.pickerView selectRow:self.cityIndex inComponent:1 animated:YES];
  437. } else if (self.pickerMode == BRAddressPickerModeArea) {
  438. [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
  439. [self.pickerView selectRow:self.cityIndex inComponent:1 animated:YES];
  440. [self.pickerView selectRow:self.areaIndex inComponent:2 animated:YES];
  441. }
  442. }
  443. - (void)addPickerToView:(UIView *)view {
  444. // 1.添加地址选择器
  445. if (view) {
  446. // 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
  447. [view setNeedsLayout];
  448. [view layoutIfNeeded];
  449. self.frame = view.bounds;
  450. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  451. CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
  452. self.pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
  453. [self addSubview:self.pickerView];
  454. } else {
  455. [self.alertView addSubview:self.pickerView];
  456. }
  457. // 2.绑定数据
  458. [self reloadData];
  459. __weak typeof(self) weakSelf = self;
  460. self.doneBlock = ^{
  461. // 点击确定按钮后,执行block回调
  462. [weakSelf removePickerFromView:view];
  463. if (weakSelf.resultBlock) {
  464. weakSelf.resultBlock(weakSelf.selectProvinceModel, weakSelf.selectCityModel, weakSelf.selectAreaModel);
  465. }
  466. };
  467. [super addPickerToView:view];
  468. }
  469. #pragma mark - 重写父类方法
  470. - (void)addSubViewToPicker:(UIView *)customView {
  471. [self.pickerView addSubview:customView];
  472. }
  473. #pragma mark - 弹出选择器视图
  474. - (void)show {
  475. [self addPickerToView:nil];
  476. }
  477. #pragma mark - 关闭选择器视图
  478. - (void)dismiss {
  479. [self removePickerFromView:nil];
  480. }
  481. #pragma mark - setter方法
  482. - (void)setSelectValues:(NSArray<NSString *> *)selectValues {
  483. self.mSelectValues = selectValues;
  484. }
  485. #pragma mark - getter方法
  486. - (NSArray *)provinceModelArr {
  487. if (!_provinceModelArr) {
  488. _provinceModelArr = [NSArray array];
  489. }
  490. return _provinceModelArr;
  491. }
  492. - (NSArray *)cityModelArr {
  493. if (!_cityModelArr) {
  494. _cityModelArr = [NSArray array];
  495. }
  496. return _cityModelArr;
  497. }
  498. - (NSArray *)areaModelArr {
  499. if (!_areaModelArr) {
  500. _areaModelArr = [NSArray array];
  501. }
  502. return _areaModelArr;
  503. }
  504. - (BRProvinceModel *)selectProvinceModel {
  505. if (!_selectProvinceModel) {
  506. _selectProvinceModel = [[BRProvinceModel alloc]init];
  507. }
  508. return _selectProvinceModel;
  509. }
  510. - (BRCityModel *)selectCityModel {
  511. if (!_selectCityModel) {
  512. _selectCityModel = [[BRCityModel alloc]init];
  513. _selectCityModel.code = @"";
  514. _selectCityModel.name = @"";
  515. }
  516. return _selectCityModel;
  517. }
  518. - (BRAreaModel *)selectAreaModel {
  519. if (!_selectAreaModel) {
  520. _selectAreaModel = [[BRAreaModel alloc]init];
  521. _selectAreaModel.code = @"";
  522. _selectAreaModel.name = @"";
  523. }
  524. return _selectAreaModel;
  525. }
  526. - (NSArray *)dataSourceArr {
  527. if (!_dataSourceArr) {
  528. _dataSourceArr = [NSArray array];
  529. }
  530. return _dataSourceArr;
  531. }
  532. - (NSArray<NSString *> *)mSelectValues {
  533. if (!_mSelectValues) {
  534. _mSelectValues = [NSArray array];
  535. }
  536. return _mSelectValues;
  537. }
  538. - (NSArray<NSNumber *> *)selectIndexs {
  539. if (!_selectIndexs) {
  540. _selectIndexs = [NSArray array];
  541. }
  542. return _selectIndexs;
  543. }
  544. @end