// // MTPickerView.m // MTPickerView // // Created by ko1o on 2019/1/21. // Copyright © 2019年 ko1o. All rights reserved. // #import "MTPickerView.h" #import "FSLocationPickerView.h" #import "MTGridSelectView.h" #define kPickerViewHeight (216.0) #define kPickerViewWidth ([UIScreen mainScreen].bounds.size.width) @interface MTPickerView () @property (nonatomic, copy) void(^vauleChangedBlock)(NSArray *values); @property (nonatomic, copy) NSArray *> *datas; @property (nonatomic, assign) MTPickerViewType type; @property (nonatomic, strong) NSArray *currentValues; @property (nonatomic, strong) UIView *toolBar; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, copy) void(^doneBlock)(NSArray *); @property (nonatomic, strong) UIDatePicker *timePickView; @property (nonatomic, strong) NSMutableArray *compmentDatas; @property (nonatomic, strong) MTGridSelectView *gridSelecteView; @property (nonatomic, strong) NSArray *weekDays; @end @implementation MTPickerView - (NSArray *)weekDays { static NSArray *gWeekDays = nil; if (!gWeekDays) { gWeekDays = @[@"周一", @"周二", @"周三", @"周四", @"周五", @"周六", @"周天"]; } return gWeekDays; } - (NSArray *)monthDays { static NSArray *gMonthDays = nil; if (!gMonthDays) { NSMutableArray *daysM = [NSMutableArray array]; for (int i = 1; i<= 31; i++) { [daysM addObject:[NSString stringWithFormat:@"每月%d号%@", i, i > 28 ? @"(无则当月底)" : @""]]; } gMonthDays = daysM; } return gMonthDays; } - (NSDate *)defaultDate { NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]]; [components setYear:1990]; [components setMonth:1]; [components setDay:1]; NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDate *mDate = [calendar dateFromComponents:components]; return mDate; } - (NSDate *)birthdayMinDate { NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]]; NSDateComponents *currentDateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]]; [components setYear:currentDateComponents.year - 100]; [components setMonth:currentDateComponents.month]; [components setDay:currentDateComponents.day]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDate *mDate = [calendar dateFromComponents:components]; return mDate; } - (NSDate *)birthdayMaxDate { NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]]; NSDateComponents *currentDateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]]; [components setYear:currentDateComponents.year - 18]; [components setMonth:currentDateComponents.month]; [components setDay:currentDateComponents.day]; NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDate *mDate = [calendar dateFromComponents:components]; return mDate; } - (MTGridSelectView *)gridSelecteViewForTitles:(NSArray *)titles multiple:(BOOL)multiple { if (!_gridSelecteView) { WeakSelf(self); CGSize itemSize = CGSizeMake(SCREEN_WIDTH, FIX_SIZE(50)); MTGridSelectView *gridView = [MTGridSelectView gridSelectViewWithItemModels:titles setupConfig:^(MTGridSelectConfig * _Nonnull config) { config.itemSize = itemSize; config.contentInset = UIEdgeInsetsZero; config.columnSpacing = 0; config.rowSpacing = 0; config.multiple = multiple; config.maxColumn = 1; config.maxSelecteCount = titles.count; } didSetupItemContentView:^UIView *(UIView * _Nonnull itemContentView, NSString *itemModel) { UIView *itemView = [[UIView alloc] initWithFrame:itemContentView.bounds]; UIView *line = [UIView lineViewWithWidth:SCREEN_WIDTH]; [itemView addSubview:line]; UILabel *titleLabel = [[UILabel alloc] init]; titleLabel.font = NORMAL_MEDIUM_FONT; titleLabel.textColor = COLOR_WITH_RGB(0x444444); titleLabel.height = itemView.height; titleLabel.x = NORMAL_SPACE; titleLabel.width = itemView.width - titleLabel.x * 2; titleLabel.text = itemModel; [itemView addSubview:titleLabel]; UIButton *pickedView = [[UIButton alloc] init]; [pickedView setImage:ImageNamed(@"TH_icon_choose_blue_sel") forState:UIControlStateSelected]; [pickedView setImage:ImageNamed(@"TH_icon_choose_white_def") forState:UIControlStateNormal]; pickedView.size = CGSizeMake(FIX_SIZE(22), FIX_SIZE(22)); pickedView.right = itemView.width - NORMAL_SPACE; pickedView.centerY = titleLabel.centerY; [itemView addSubview:pickedView]; return itemView; } itemStateChanged:^(UIView * _Nonnull itemView, id _Nonnull itemModel, MTGridItemState state, BOOL changeByInner) { UIButton *pickedView = [itemView.subviews lastObject]; pickedView.selected = state == MTGridItemStateSelected; } selectValueChanged:^(NSArray * _Nonnull selectedModels) { weakself.currentValues = selectedModels; }]; gridView.collectionView.contentInset = UIEdgeInsetsZero; gridView.collectionView.scrollEnabled = NO; gridView.height = itemSize.height * titles.count + homeIndicatorHeight(); _gridSelecteView = gridView; } return _gridSelecteView; } - (UIDatePicker *)timePickView { if (!_timePickView) { UIDatePicker *timePickView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 216)]; NSLocale *local = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_GB"]; //新发现这里不会根据系统的语言变了 中文24小时GB [timePickView setLocale:local]; [timePickView setTimeZone:[NSTimeZone localTimeZone]]; switch (self.type) { case MTPickerViewTypeBirthday: [timePickView setDatePickerMode:UIDatePickerModeDate]; break; case MTPickerViewTypeDateAndTime: { [timePickView setDatePickerMode:UIDatePickerModeDateAndTime]; break; } case MTPickerViewTypeTime: { [timePickView setDatePickerMode:UIDatePickerModeTime]; break; } default: break; } [timePickView setMinimumDate:[self birthdayMinDate]]; [timePickView setMaximumDate:[self birthdayMaxDate]]; [timePickView addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; timePickView.backgroundColor = RGB(0xfb, 0xfb, 0xfb); _timePickView = timePickView; if (@available(iOS 13.4, *)) { timePickView.preferredDatePickerStyle = UIDatePickerStyleWheels; } else { // Fallback on earlier versions } } return _timePickView; } - (void)datePickerValueChanged:(UIDatePicker *)birthdayPicker { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSArray *datas = [[fmt stringFromDate:birthdayPicker.date] componentsSeparatedByString:@"-"]; if (self.vauleChangedBlock) { self.currentValues = datas; self.vauleChangedBlock(datas); } } - (NSArray *)currentVaules { if (self.type == MTPickerViewTypeBirthday) { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSArray *datas = [[fmt stringFromDate:((UIDatePicker *)self.picker).date] componentsSeparatedByString:@"-"]; self.currentValues = datas; } if (self.type == MTPickerViewTypeDateAndTime) { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd HH:mm"; NSString *dateTimeStr = [fmt stringFromDate:((UIDatePicker *)self.picker).date]; self.currentValues = @[dateTimeStr]; } if (self.type == MTPickerViewTypeTime) { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"HH:mm"; NSString *dateTimeStr = [fmt stringFromDate:((UIDatePicker *)self.picker).date]; self.currentValues = @[dateTimeStr]; } if (_currentValues > 0) return _currentValues; if (_currentValues.count < self.datas.count) { NSMutableArray *currentValues = [NSMutableArray array]; for (int i = 0; i < self.datas.count; i++) { NSArray *datas = self.datas[i]; if (i == 0) { if (datas.count > 0) { [currentValues addObject:datas.firstObject]; } } else if (i == 1) { if (datas.count > 1 && [datas.firstObject isKindOfClass:[NSArray class]] && ((NSArray *)datas.firstObject).count > 0) { [currentValues addObject:((NSArray *)datas.firstObject).firstObject]; } } } _currentValues = currentValues; } return _currentValues; } - (void)setVaules:(NSArray*)values { _currentValues = values; switch (self.type) { case MTPickerViewTypeBirthday: { NSString *dataString = [values componentsJoinedByString:@"-"]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [self defaultDate]; } [(UIDatePicker *)self.picker setDate:date animated:YES]; [self datePickerValueChanged:(UIDatePicker *)self.picker]; break; } case MTPickerViewTypeLocation: { FSLocationPickerView *locationPicker = (FSLocationPickerView *)self.picker; NSString *province = nil; NSString *city = nil; NSString *area = nil; if (values.count >= 1) { province = values[0]; } if (values.count >= 2) { city = values[1]; } if (values.count >= 3) { area = values[2];; } locationPicker.size = locationPicker.pickerView.size; [locationPicker addSubview:locationPicker.pickerView]; [locationPicker showPickerViewWithProvince:province city:city area:area]; [locationPicker.pickerView reloadAllComponents]; WeakSelf(self); locationPicker.locationPickerVauleDidChangeBlock = ^(FSLocationPickerView *pickerView, NSArray *locationInfo) { StrongSelf(self); if (self.vauleChangedBlock) { self.vauleChangedBlock(locationInfo); } self.currentValues = locationInfo; }; self.currentValues = [locationPicker locationInfo]; if (self.vauleChangedBlock) { self.vauleChangedBlock([locationPicker locationInfo]); } break; } case MTPickerViewTypeRange: { UIPickerView *picker = (UIPickerView *)self.picker; picker.delegate = self; picker.dataSource = self; [picker reloadAllComponents]; // 默认选中 for (int i = 0; i < values.count; i++) { id value = values[i]; NSInteger row = [self.datas[i] indexOfObject:value]; [picker selectRow:row inComponent:i animated:YES]; self.currentValues = values; if (self.vauleChangedBlock) { self.vauleChangedBlock(values); } } break; } case MTPickerViewTypeNone: { UIPickerView *picker = (UIPickerView *)self.picker; picker.delegate = self; picker.dataSource = self; NSMutableArray *datas = [NSMutableArray array]; for (int i = 0; i < values.count; i++) { NSInteger row = [self.datas[i] indexOfObject:values[i]]; if (row <= 0 || row >= self.datas[i].count) { row = 0; } [picker selectRow:row inComponent:i animated:YES]; _currentValues = values; if ([self.datas[i] isKindOfClass:[NSArray class]] && row < ((NSArray *)self.datas[i]).count) { [datas addObject:self.datas[i][row]]; } } if (values.count == 0) { for (int i = 0; i < self.datas.count; i++) { [picker selectRow:0 inComponent:i animated:YES]; if ([self.datas[i] isKindOfClass:[NSArray class]] && 0 < ((NSArray *)self.datas[i]).count) { [datas addObject:self.datas[i][0]]; } } } self.currentValues = datas; if (self.vauleChangedBlock) { self.vauleChangedBlock(datas); } [picker reloadAllComponents]; break; } case MTPickerViewTypeDateAndTime: { NSString *dataString = [values firstObject]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd HH:mm"; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [NSDate date]; } [self datePickerValueChanged:(UIDatePicker *)self.picker]; break; } case MTPickerViewTypeTime: { NSString *dataString = [values firstObject]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"HH:mm"; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [NSDate date]; } [(UIDatePicker *)self.picker setDate:[NSDate date] animated:YES]; [self datePickerValueChanged:(UIDatePicker *)self.picker]; break; } default: break; } } - (UIView *)pickerWithType:(MTPickerViewType)type defaultValues:(NSArray*)values { [self setVaules:values]; switch (type) { case MTPickerViewTypeWeekMulti: { MTGridSelectView *gridView = [self gridSelecteViewForTitles:[self weekDays] multiple:YES]; for (NSString *value in values) { NSInteger index = [[self weekDays] indexOfObject:value]; if (index != NSNotFound) { dispatch_async(dispatch_get_main_queue(), ^{ [gridView selectItemAtIndex:index]; }); } } return gridView; } case MTPickerViewTypeMonthDay: { MTGridSelectView *gridView = [self gridSelecteViewForTitles:[self monthDays] multiple:NO]; for (NSString *value in values) { NSInteger index = [[self monthDays] indexOfObject:value]; if (index != NSNotFound) { dispatch_async(dispatch_get_main_queue(), ^{ [gridView selectItemAtIndex:index]; }); } } return gridView; } case MTPickerViewTypeBirthday: { UIDatePicker *picker = [self timePickView]; NSString *dataString = [values componentsJoinedByString:@"-"]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [self defaultDate]; } [picker setDate:date animated:YES]; [self datePickerValueChanged:picker]; return picker; } case MTPickerViewTypeLocation: { FSLocationPickerView *locationPicker = [[FSLocationPickerView alloc] init]; NSString *province = nil; NSString *city = nil; NSString *area = nil; if (values.count >= 1) { province = values[0]; } if (values.count >= 2) { city = values[1]; } if (values.count >= 3) { area = values[2]; } locationPicker.size = locationPicker.pickerView.size; [locationPicker addSubview:locationPicker.pickerView]; [locationPicker showPickerViewWithProvince:province city:city area:area]; [locationPicker.pickerView reloadAllComponents]; WeakSelf(self); locationPicker.locationPickerVauleDidChangeBlock = ^(FSLocationPickerView *pickerView, NSArray *locationInfo) { StrongSelf(self); self.currentValues = locationInfo; if (self.vauleChangedBlock) { self.vauleChangedBlock(locationInfo); } }; self.currentValues = [locationPicker locationInfo]; if (self.vauleChangedBlock) { self.vauleChangedBlock([locationPicker locationInfo]); } return locationPicker; break; } case MTPickerViewTypeRange: { UIPickerView *picker = [[UIPickerView alloc] initWithFrame:self.bounds]; picker.delegate = self; picker.dataSource = self; [picker reloadAllComponents]; // 默认选中 for (int i = 0; i < values.count; i++) { id value = values[i]; NSInteger row = [self.datas[i] indexOfObject:value]; [picker selectRow:row inComponent:i animated:YES]; if (self.vauleChangedBlock) { self.currentValues = values; self.vauleChangedBlock(values); } } return picker; } case MTPickerViewTypeNone: case MTPickerViewTypeLinkMuti: { UIPickerView *picker = [[UIPickerView alloc] initWithFrame:self.bounds]; picker.delegate = self; picker.dataSource = self; NSMutableArray *datas = [NSMutableArray array]; for (int i = 0; i < values.count; i++) { if (i < self.compmentDatas.count) { NSArray *datasOfComment = self.compmentDatas[i]; NSInteger row = [datasOfComment indexOfObject:values[i]]; if (row <= 0 || row >= datasOfComment.count) { row = 0; } [picker selectRow:row inComponent:i animated:YES]; if (datasOfComment.count > row) { [datas addObject:datasOfComment[row]]; } } } if (values.count == 0 && self.datas.count == self.compmentDatas.count) { for (int i = 0; i < self.datas.count; i++) { NSArray *datasOfComment = self.compmentDatas[i]; [picker selectRow:0 inComponent:i animated:YES]; if (datasOfComment.count > 0) { [datas addObject:datasOfComment[0]]; } } } if (self.vauleChangedBlock) { self.currentValues = datas; self.vauleChangedBlock(datas); } [picker reloadAllComponents]; return picker; break; } case MTPickerViewTypeDateAndTime: { UIDatePicker *picker = [self timePickView]; NSString *dataString = [values componentsJoinedByString:@"-"]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd HH:mm"; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [NSDate date]; } [picker setDate:date animated:YES]; [self datePickerValueChanged:picker]; return picker; } case MTPickerViewTypeTime: { UIDatePicker *picker = [self timePickView]; NSString *dataString = [values componentsJoinedByString:@":"]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd HH:mm"; dataString = [[[fmt stringFromDate:[NSDate date]] substringToIndex:@"yyyy-MM-dd ".length] stringByAppendingString:dataString]; NSDate *date = [fmt dateFromString:dataString]; if (!date) { date = [NSDate date]; } [picker setDate:date animated:YES]; if (@available(iOS 15.0, *)) { picker.roundsToMinuteInterval = NO; } else { // Fallback on earlier versions } [self datePickerValueChanged:picker]; [self loopSubviews:picker action:^(UIView *view) { if ([view isKindOfClass:NSClassFromString(@"_UIDatePickerCalendarTimeLabel")]) { // 避免选中时间出现高亮 [view removeFromSuperview]; } }]; return picker; } default: break; } return nil; } - (void)loopSubviews:(UIView *)superView action:(void(^)(UIView *view))action { for (UIView *view in superView.subviews) { if (action) { action(view); } [self loopSubviews:view action:action]; } } - (void)setupUI { self.frame = CGRectMake(0, 0, kPickerViewWidth, kPickerViewHeight); self.backgroundColor = SUB_BG_COLOR; } - (instancetype)init { if (self = [super init]) { [self setupUI]; } return self; } - (void)setTitle:(NSString *)title { _title = title; self.titleLabel.text = title; } // 根据类型来 + (instancetype)pickerViewWithType:(MTPickerViewType)type defaultValues:(nullable NSArray*)values valueDidChange:(void(^)(NSArray *values))valueChangedBlock done:(void(^)(NSArray *selectedValues))doneBlock { return [self pickerViewWithType:type datas:nil defaultValues:values valueDidChange:valueChangedBlock done:doneBlock]; } + (instancetype)pickerViewWithDatas:(NSArray *>*)datas defaultValues:(nullable NSArray *)values valueDidChange:(void(^)(NSArray *values))valueChangedBlock done:(void(^)(NSArray *selectedValues))doneBlock { return [self pickerViewWithType:MTPickerViewTypeNone datas:datas defaultValues:values valueDidChange:valueChangedBlock done:doneBlock]; } + (instancetype)pickerViewWithType:(MTPickerViewType)type datas:(nullable NSArray *>*)datas defaultValues:(NSArray*)values valueDidChange:(void(^)(NSArray *values))vauleChangedBlock done:(void(^)(NSArray *selectedValues))doneBlock { if (datas.count == 0 && type == MTPickerViewTypeNone) { return nil; } MTPickerView *pickerView = [[MTPickerView alloc] init]; pickerView.multipleTouchEnabled = NO; pickerView.vauleChangedBlock = vauleChangedBlock; pickerView.doneBlock = doneBlock; pickerView.datas = datas; pickerView.type = type; [pickerView updateCompmentDatas]; pickerView.picker = [pickerView pickerWithType:type defaultValues:values]; [pickerView setupUIWithPickerView:pickerView.picker]; return pickerView; } - (void)cancelDidClick { [[UIApplication sharedApplication].keyWindow endEditing:YES]; } - (void)doneDidClick { [[UIApplication sharedApplication].keyWindow endEditing:YES]; if (self.doneBlock) { self.doneBlock([self currentVaules]); } } #pragma mark - UIPickerViewDataSource // returns the number of 'columns' to display. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return self.datas.count; } - (NSArray *)datasForComponent:(NSInteger)component { NSArray *datasOfComment = self.datas[component]; if (self.type == MTPickerViewTypeLinkMuti) { if (component == 0) { return self.datas[component]; } else if (component == 1) { long first = [(UIPickerView *)self.picker selectedRowInComponent:0]; NSArray *arr = (NSArray *)self.datas[component]; if (first < arr.count) { return arr[first]; } else { return nil; } } else if (component == 2) { long first = [(UIPickerView *)self.picker selectedRowInComponent:0]; long second = [(UIPickerView *)self.picker selectedRowInComponent:1]; NSArray *arr = (NSArray *)self.datas[component]; if (first < arr.count) { NSArray *subArr = arr[first]; if (second < subArr.count) { return subArr[second]; } } return nil; } } return datasOfComment; } - (void)updateCompmentDatas { if (!self.compmentDatas) { self.compmentDatas = [NSMutableArray array]; } [self.compmentDatas removeAllObjects]; for (int i = 0; i < self.datas.count; i++) { id obj = [self datasForComponent:i]; if (obj) { [self.compmentDatas addObject:obj]; } } } // returns the # of rows in each component.. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { NSArray *datas = [self datasForComponent:component]; return datas.count; } + (instancetype)pickerViewWithCustomView:(UIView *)customView done:(void(^)(NSArray *selectedValues))doneBlock { MTPickerView *pickerView = [[MTPickerView alloc] init]; pickerView.multipleTouchEnabled = NO; pickerView.doneBlock = doneBlock; [pickerView setupUIWithPickerView:customView]; return pickerView; } - (void)setupUIWithPickerView:(UIView *)picker { UIView *toolBar = [[UIView alloc] init]; toolBar.width = SCREEN_WIDTH; toolBar.backgroundColor = SUB_BG_COLOR; toolBar.height = 44; UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeSystem]; [cancelButton setTitle:@"取消" forState:UIControlStateNormal]; [cancelButton setTitleColor:CONTENT_COLOR forState:UIControlStateNormal]; cancelButton.titleLabel.font = MT_FONT_REGULAR_SIZE(15); [cancelButton sizeToFit]; cancelButton.left = 15; cancelButton.centerY = toolBar.height * 0.5; [cancelButton addTarget:self action:@selector(cancelDidClick) forControlEvents:UIControlEventTouchUpInside]; [toolBar addSubview:cancelButton]; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [button setTitle:@"完成" forState:UIControlStateNormal]; [button setTitleColor:THEME_COLOR forState:UIControlStateNormal]; button.titleLabel.font = MT_FONT_REGULAR_SIZE(15); [button sizeToFit]; button.right = SCREEN_WIDTH - 15; button.centerY = toolBar.height * 0.5; [button addTarget:self action:@selector(doneDidClick) forControlEvents:UIControlEventTouchUpInside]; [toolBar addSubview:button]; [self addSubview:toolBar]; UILabel *titleLabel = [[UILabel alloc] init]; titleLabel.font = MT_FONT_REGULAR_SIZE(14.0); titleLabel.textColor = COLOR_WITH_RGB(0x777777); titleLabel.x = 15; titleLabel.height = toolBar.height; titleLabel.width = button.x - titleLabel.x - 15; [toolBar addSubview:titleLabel]; self.titleLabel = titleLabel; [self addSubview:toolBar]; picker.y = toolBar.bottom + FIX_SIZE(15); [self addSubview:picker]; self.width = SCREEN_WIDTH; picker.centerX = self.width * 0.5; self.height = picker.bottom; } #pragma mark - UIPickerViewDelegate - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { return self.width / self.datas.count; } - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { return 44.0; } - (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { NSArray *datas = [self datasForComponent:component]; return datas[row]; } - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { UILabel* pickerLabel = (UILabel*)view; if (!pickerLabel){ pickerLabel = [[UILabel alloc] init]; [pickerLabel setBackgroundColor:[UIColor clearColor]]; [pickerLabel setFont:MT_FONT_REGULAR_SIZE(15)]; pickerLabel.textColor = UIColor.blackColor; } // Fill the label text here pickerLabel.text= [self pickerView:pickerView titleForRow:row forComponent:component]; pickerLabel.textAlignment = NSTextAlignmentCenter; return pickerLabel; return view; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (self.type == MTPickerViewTypeRange) { // 取出第一个 NSInteger firstSelectedRow = [pickerView selectedRowInComponent:0]; NSInteger secondSelectedRow = [pickerView selectedRowInComponent:1]; if (firstSelectedRow > secondSelectedRow) { if (component == 0) { // 当前动的是第一列 // 调整第二列 [pickerView selectRow:firstSelectedRow inComponent:1 animated:YES]; } else { // 调整第一列 [pickerView selectRow:secondSelectedRow inComponent:0 animated:YES]; } } } if (self.type == MTPickerViewTypeLinkMuti) { for (NSInteger i = component; i < self.datas.count - 1; i++) { [self updateCompmentDatas]; [pickerView reloadComponent:i + 1]; [pickerView selectRow:0 inComponent:i + 1 animated:NO]; } } NSMutableArray *datasM = [NSMutableArray array]; for (int i = 0; i < pickerView.numberOfComponents; i++) { if (i < self.compmentDatas.count) { NSArray *datasOfComment = self.compmentDatas[i]; NSInteger row = [pickerView selectedRowInComponent:i]; NSString *data = datasOfComment[row]; if (data) { [datasM addObject:data]; } } } self.currentValues = datasM; if (self.vauleChangedBlock) { self.vauleChangedBlock([datasM copy]); } } @end