cdts/xdts-ios 3/TreeHole/Code/Utility/MTPickerView/MTPickerView.m
2023-07-27 09:20:00 +08:00

852 lines
31 KiB
Objective-C

//
// 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 () <UIPickerViewDelegate, UIPickerViewDataSource>
@property (nonatomic, copy) void(^vauleChangedBlock)(NSArray <NSString *>*values);
@property (nonatomic, copy) NSArray <NSArray<NSString *> *> *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 <NSString *> *);
@property (nonatomic, strong) UIDatePicker *timePickView;
@property (nonatomic, strong) NSMutableArray<NSArray *> *compmentDatas;
@property (nonatomic, strong) MTGridSelectView *gridSelecteView;
@property (nonatomic, strong) NSArray<NSString *> *weekDays;
@end
@implementation MTPickerView
- (NSArray<NSString *> *)weekDays {
static NSArray<NSString *> *gWeekDays = nil;
if (!gWeekDays) {
gWeekDays = @[@"周一", @"周二", @"周三", @"周四", @"周五", @"周六", @"周天"];
}
return gWeekDays;
}
- (NSArray<NSString *> *)monthDays {
static NSArray<NSString *> *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 <NSString *>*)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<NSString *>*)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<NSString *>*)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<NSString *>*)values valueDidChange:(void(^)(NSArray <NSString *>*values))valueChangedBlock done:(void(^)(NSArray <NSString *> *selectedValues))doneBlock
{
return [self pickerViewWithType:type datas:nil defaultValues:values valueDidChange:valueChangedBlock done:doneBlock];
}
+ (instancetype)pickerViewWithDatas:(NSArray <NSArray<NSString *> *>*)datas defaultValues:(nullable NSArray<NSString *> *)values valueDidChange:(void(^)(NSArray <NSString *>*values))valueChangedBlock done:(void(^)(NSArray <NSString *> *selectedValues))doneBlock
{
return [self pickerViewWithType:MTPickerViewTypeNone datas:datas defaultValues:values valueDidChange:valueChangedBlock done:doneBlock];
}
+ (instancetype)pickerViewWithType:(MTPickerViewType)type datas:(nullable NSArray <NSArray <NSString *>*>*)datas defaultValues:(NSArray<NSString *>*)values valueDidChange:(void(^)(NSArray <NSString *>*values))vauleChangedBlock done:(void(^)(NSArray <NSString *> *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 <NSString *> *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