852 lines
31 KiB
Objective-C
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
|