由于公司项目有个新需求,需要弹出公历和农历相互转化的时间选择器(类似万年历的时间弹框)。刚拿到需求的时候,在网上搜索好久,发现农历的时间选择器都少之甚少,又何况公历和农历的相互转化的时间选择器。遍寻许久终于发现一位大佬写的农历时间选择器。在此基础之上,整合公司的需求,终于完成了任务。下面分享给大家。
点击农历按钮转化为农历
首先,要自定义一个公历时间选择器弹框,可以分为多种样式(年月日时,年月日,月日时等等)。
声明bool值_isNong判断是公历还是农历。只要点击农历按钮的时候,设置_isNong为yes,刷新pikerView即可。
#pragma mark -每一行显示viewForRow
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
UILabel *customLabel = (UILabel *)view;
if (!customLabel) {
customLabel = [[UILabel alloc] init];
customLabel.textAlignment = NSTextAlignmentCenter;
[customLabel setFont:[UIFont systemFontOfSize:12]];
}
NSString *title;
if (_isNong) {
//农历
switch (self.dateStyle) {
case DateStyleShowYearMonthDayHourMinute:{
if (component==0) {
NSString * str = years[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
str =[NSString stringWithFormat:@"%@", [array objectAtIndex:2]];
title= [NSString stringWithFormat:@"%@年", str];
}
if (component==1) {
NSString * str = months[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
if ([[array objectAtIndex:0]isEqualToString:@"a"]) {
str =[((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1];
} else {
str =[NSString stringWithFormat:@"%@%@", @"闰", [((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1]];
}
title= [NSString stringWithFormat:@"%@", str];
}
if (component==2) {
NSString * str = days[row];
int day = [str intValue];
NSString *jieqi=[[IDJCalendarUtil jieqiWithYear:[_cal.year intValue]]objectForKey:[NSString stringWithFormat:@"%@-%d", _cal.month, [str intValue]]];
if (!jieqi) {
str =[NSString stringWithFormat:@"%@", [((IDJChineseCalendar *) _cal).chineseDays objectAtIndex:[str intValue]-1]];
} else {
str=[NSString stringWithFormat:@"%@", jieqi];
}
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithChineseYear:[_cal.year integerValue] month:_cal.month day:day]];
title= [NSString stringWithFormat:@"%@%@", str,[_weekArray objectAtIndex:weekday.intValue]];
}
if (component==3) {
title = [NSString stringWithFormat:@"%@时",_hourArray[row]];
}
if (component==4) {
title = [NSString stringWithFormat:@"%@分",_minuteArray[row]];
}
}
break;
case DateStyleShowYearMonthDay:
{
if (component==0) {
NSString * str = years[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
str =[NSString stringWithFormat:@"%@", [array objectAtIndex:2]];
title= [NSString stringWithFormat:@"%@年", str];
}
if (component==1) {
NSString * str = months[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
if ([[array objectAtIndex:0]isEqualToString:@"a"]) {
str =[((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1];
} else {
str =[NSString stringWithFormat:@"%@%@", @"闰", [((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1]];
}
title= [NSString stringWithFormat:@"%@", str];
}
if (component==2) {
NSString * str = days[row];
NSString *jieqi=[[IDJCalendarUtil jieqiWithYear:[_cal.year intValue]]objectForKey:[NSString stringWithFormat:@"%@-%d", _cal.month, [str intValue]]];
if (!jieqi) {
str =[NSString stringWithFormat:@"%@", [((IDJChineseCalendar *) _cal).chineseDays objectAtIndex:[str intValue]-1]];
} else {
str=[NSString stringWithFormat:@"%@", jieqi];
}
// title= [NSString stringWithFormat:@"%@", str];
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithChineseYear:[_cal.year integerValue] month:_cal.month day:[days[row] integerValue]]];
title= [NSString stringWithFormat:@"%@%@", str,[_weekArray objectAtIndex:weekday.intValue]];
}
}
break;
case DateStyleShowMonthDayHourMinute:
{
NSString *pYear=[_cal.year copy];
if (![pYear isEqualToString:_cal.year]) {
[self changeMonths];
}
// NSString *pMonth=[_cal.month copy];
//
// if (![pMonth isEqualToString:_cal.month]) {
// //联动天数的滚轮
// [self changeDays];
// }
if (component==0) {
NSString * str = months[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
if ([[array objectAtIndex:0]isEqualToString:@"a"]) {
str =[((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1];
} else {
str =[NSString stringWithFormat:@"%@%@", @"闰", [((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1]];
}
title= [NSString stringWithFormat:@"%@", str];
}
if (component==1) {
NSString * str = days[row];
NSString *jieqi=[[IDJCalendarUtil jieqiWithYear:[_cal.year intValue]]objectForKey:[NSString stringWithFormat:@"%@-%d", _cal.month, [str intValue]]];
if (!jieqi) {
str =[NSString stringWithFormat:@"%@", [((IDJChineseCalendar *) _cal).chineseDays objectAtIndex:[str intValue]-1]];
} else {
str=[NSString stringWithFormat:@"%@", jieqi];
}
// title= [NSString stringWithFormat:@"%@", str];
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithChineseYear:[_cal.year integerValue] month:_cal.month day:[days[row] integerValue]]];
title= [NSString stringWithFormat:@"%@%@", str,[_weekArray objectAtIndex:weekday.intValue]];
}
if (component==2) {
title = [NSString stringWithFormat:@"%@时",_hourArray[row]];
}
if (component==3) {
title = [NSString stringWithFormat:@"%@分",_minuteArray[row]];
}
}
break;
case DateStyleShowMonthDay:
{
NSString *pYear=[_cal.year copy];
if (![pYear isEqualToString:_cal.year]) {
[self changeMonths];
}
NSString *pMonth=[_cal.month copy];
if (![pMonth isEqualToString:_cal.month]) {
//联动天数的滚轮
[self changeDays];
}
if (component==0) {
NSString * str = months[row];
NSArray *array=[str componentsSeparatedByString:@"-"];
if ([[array objectAtIndex:0]isEqualToString:@"a"]) {
str =[((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1];
} else {
str =[NSString stringWithFormat:@"%@%@", @"闰", [((IDJChineseCalendar *)_cal).chineseMonths objectAtIndex:[[array objectAtIndex:1]intValue]-1]];
}
title= [NSString stringWithFormat:@"%@", str];
}
if (component==1) {
NSString * str = days[row];
NSString *jieqi=[[IDJCalendarUtil jieqiWithYear:[_cal.year intValue]]objectForKey:[NSString stringWithFormat:@"%@-%d", _cal.month, [str intValue]]];
if (!jieqi) {
str =[NSString stringWithFormat:@"%@", [((IDJChineseCalendar *) _cal).chineseDays objectAtIndex:[str intValue]-1]];
} else {
str=[NSString stringWithFormat:@"%@", jieqi];
}
// title= [NSString stringWithFormat:@"%@", str];
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithChineseYear:[_cal.year integerValue] month:_cal.month day:[days[row] integerValue]]];
title= [NSString stringWithFormat:@"%@%@", str,[_weekArray objectAtIndex:weekday.intValue]];
}
}
break;
default:
break;
}
}else {//阳历
switch (self.dateStyle) {
case DateStyleShowYearMonthDayHourMinute:
if (component==0) {
title = [NSString stringWithFormat:@"%@年",_yearArray[row]];
}
if (component==1) {
title = [NSString stringWithFormat:@"%@月",_monthArray[row]];
}
if (component==2) {
\
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithSolarYear:[_yearArray[yearIndex] integerValue] month:_monthArray[monthIndex] day:[_dayArray[row] integerValue]]];
title = [NSString stringWithFormat:@"%@日%@",_dayArray[row],[_weekArray objectAtIndex:weekday.intValue ]];
}
if (component==3) {
title = [NSString stringWithFormat:@"%@时",_hourArray[row]];
}
if (component==4) {
title = [NSString stringWithFormat:@"%@分",_minuteArray[row]];
}
break;
case DateStyleShowYearMonthDay:
if (component==0) {
title = [NSString stringWithFormat:@"%@年",_yearArray[row]];
}
if (component==1) {
title = [NSString stringWithFormat:@"%@月",_monthArray[row]];
}
if (component==2) {
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithSolarYear:[_yearArray[yearIndex] integerValue] month:_monthArray[monthIndex] day:[_dayArray[row] integerValue]]];
title = [NSString stringWithFormat:@"%@日%@",_dayArray[row],[_weekArray objectAtIndex:weekday.intValue ]];
}
break;
case DateStyleShowMonthDayHourMinute:
if (component==0) {
title = [NSString stringWithFormat:@"%@月",_monthArray[row%12]];
}
if (component==1) {
// title = _dayArray[row];
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithSolarYear:[_yearArray[yearIndex] integerValue] month:_monthArray[monthIndex] day:[_dayArray[row] integerValue]]];
title = [NSString stringWithFormat:@"%@日%@",_dayArray[row],[_weekArray objectAtIndex:weekday.intValue ]];
}
if (component==2) {
title = [NSString stringWithFormat:@"%@时",_hourArray[row]];
}
if (component==3) {
title = [NSString stringWithFormat:@"%@分",_minuteArray[row]];
}
break;
case DateStyleShowMonthDay:
if (component==0) {
title = [NSString stringWithFormat:@"%@月",_monthArray[row%12]];
}
if (component==1) {
// title = _dayArray[row];
NSString * weekday = [NSString stringWithFormat:@"%d",[IDJCalendarUtil weekDayWithSolarYear:[_yearArray[yearIndex] integerValue] month:_monthArray[monthIndex] day:[_dayArray[row] integerValue]]];
title = [NSString stringWithFormat:@"%@日%@",_dayArray[row],[_weekArray objectAtIndex:weekday.intValue ]];
}
break;
default:
title = @"";
break;
}
}
customLabel.text = title;
return customLabel;
}
关于农历,是参照大佬的(IDJChineseCalendar)封装改编的。当点击农历的时候,调用下面的方法
-(void)nongAction:(UIButton *)button{
button.selected = !button.selected;
_isNong = !_isNong;
if (_isNong) {
//显示农历数据
_cal=[[IDJChineseCalendar alloc]initWithYearStart:MINYEAR end:MAXYEAR];
[self _setYears];
[self _setMonthsInYear:[_cal.year intValue]];
[self _setDaysInMonth:_cal.month year:[_cal.year intValue]];
}
[self getNowDate:self.scrollToDate animated:YES];
[self.datePicker reloadAllComponents];
}