iOS小技能:时间选择器(支持修改筛选的时间纬度精确到时分秒、设置默认选中的时间)

380 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

前言

  • 支持修改筛选的时间纬度精确到时分秒
  • 支持设置默认选中的时间

I 时间选择器

pod 'PGDatePicker' ,'2.6.9'

1.1 用法

  1. 初始化datePick
- (PGDatePickManager *)datePickManager{
    if (nil == _datePickManager) {
        PGDatePickManager *datePickManager = [[PGDatePickManager alloc]init];
        
        _datePickManager = datePickManager;        
        
        datePickManager.isShadeBackground = true;
        PGDatePicker *datePicker = datePickManager.datePicker;
        datePicker.delegate = self;
        datePicker.datePickerType = PGDatePickerTypeLine;
        datePicker.isHiddenMiddleText = false;
//        datePicker.datePickerMode = PGDatePickerModeDateHourMinute;
        
        
        datePicker.datePickerMode = PGDatePickerModeDate;

        
        datePickManager.cancelButtonText = QCTLocal(@"myclear_cache");
        datePickManager.datePicker.textColorOfSelectedRow = rgb(51,51,51);
        datePickManager.titleLabel.textColor = rgb(51,51,51);
        datePickManager.datePicker.lineBackgroundColor = k_tableView_Line;
        datePickManager.confirmButtonTextColor = BASE_RED_COLOR;
        
        
    }
    return _datePickManager;
}


  1. 点击日期控件弹出日期选择器

- (void)dateSelect:(UIButton *)btn
{

    [self presentViewController:self.datePickManager animated:false completion:nil];
}
  1. 监听时间的选择

PGDatePickerDelegate

- (void)datePicker:(PGDatePicker *)datePicker didSelectDate:(NSDateComponents *)dateComponents {
    NSString * string = nil;
    NSDate * date =[NSDate setYear:dateComponents.year month:dateComponents.month day:dateComponents.day hour:dateComponents.hour minute:dateComponents.minute];

    switch (datePicker.datePickerMode) {//PGDatePickerModeDate
        case PGDatePickerModeDate://PGDatePickerModeDate
            {
                //            NSString * string =[self dateFormattingWithDate:date toFormate:@"YYYY-MM-dd HH:mm"];
                string =[QCT_Common date4YYMMDD:date];

                
            }
            break;
            
        default:
        {
//            NSDate * date =[NSDate setYear:dateComponents.year month:dateComponents.month day:dateComponents.day hour:dateComponents.hour minute:dateComponents.minute];
            //            NSString * string =[self dateFormattingWithDate:date toFormate:@"YYYY-MM-dd HH:mm"];
             string =[QCT_Common date:date];

            
        }
            break;
    }
    
    
//    if( == ){
//
//
//    }else if (<#expression#>)
    
    
    
    
    NSLog(@"date = %@", string);
    
    switch (self.filterViewModel.timeModel.type) {
        case QCTsubFilterTimeViewModelType4Statr:
        {
            self.filterViewModel.timeModel.startStr = string;
            
            self.filterViewModel.timeModel.isclearstartStr = NO;
        }
            break;
            
        case QCTsubFilterTimeViewModelType4End:
        {
            
            
            //
            //            NSString * Title= [NSString stringWithFormat:@"%02ld-%02ld-%02ld",(long)dateComponents.year,(long)dateComponents.month,(long)dateComponents.day];
            
            
            self.filterViewModel.timeModel.isclearendStr = NO;
            
            self.filterViewModel.timeModel.endStr = string;
            
        }
            break;
            
            
        default:
            break;
    }
    
    [self.filterViewModel.reloadSubject sendNext:nil];
    
    
}

1.2 设置默认选中的时间

注意时间的格式是yyyy-MM-dd" 还是yyyy-MM-dd HH:mm",如果格式错误,获取的date将是nil。

- (void)dateSelect:(UIButton *)btn
{
    // 传入时间,进行默认选中特定时间

    
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
        dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

    [dateFormatter setDateFormat:@"yyyy-MM-dd"];// 注意
    
    NSDate *date ;

    if(btn.tag == 0){
        
        date = [dateFormatter dateFromString: staStr];
        

    }else {
        
        date = [dateFormatter dateFromString: endStr];
    }
    
        [datePicker setDate:date animated:false];

 }   

封装格式转换

+ (NSDate*)dateWithFormatterString:(NSString*)dateWithString{
    
    
    NSDate *date = [self dateWithFormatterString:dateWithString dateFormat:@"yyyy-MM-dd HH:mm"];
    
    return date;

}

+ (NSDate*)dateWithFormatterStringyyyyMMDD:(NSString*)dateWithString{
    
    
    NSDate *date = [self dateWithFormatterString:dateWithString dateFormat:@"yyyy-MM-dd"];
    
    
    return date;

}
+ (NSDate*)dateWithFormatterStringyyyyMMDDhhmmss:(NSString*)dateWithString{
    
    
    
    NSDate *date = [self dateWithFormatterString:dateWithString dateFormat:@"yyyy-MM-dd HH:mm:ss"];

    
    return date;

}



+ (NSDate*)dateWithFormatterString:(NSString*)dateWithString dateFormat:(NSString*)dateFormat {
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
    dateFormatter.dateFormat = dateFormat;
    NSDate *date = [dateFormatter dateFromString:dateWithString];
    return date;
    
}



1.3 适配iOS12系统上日期视图被筛选视图遮挡问题

背景:为了适配iOS12系统上日期视图被筛选视图遮挡问题

方案:修改第三方日期视图的层级

修改PGDatePickManager,在viewWillLayoutSubviews将contentView和dismissView添加到keyWindow

由于是第三方SDK,可使用自定义类重写viewWillLayoutSubviews,但是推荐在分类使用方法交换进行实现

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    
    self.headerView.style = self.style;
    self.dismissView.frame = self.view.bounds;
    self.contentView.backgroundColor = self.datePicker.backgroundColor;
    if (self.style == PGDatePickManagerStyleSheet) {
        [self setupStyleSheet];
    }else if (self.style == PGDatePickManagerStyleAlertTopButton) {
        [self setupStyleAlert];
    }else {
        [self setupStyle3];
    }
//    [self.view bringSubviewToFront:self.contentView];
    [[UIApplication sharedApplication].keyWindow addSubview:_dismissView];
    [[UIApplication sharedApplication].keyWindow addSubview:self.contentView];

}