美文网首页
UIPickerView 设置 时间选择器

UIPickerView 设置 时间选择器

作者: 阳光下的叶子呵 | 来源:发表于2022-01-05 23:13 被阅读0次

遵守代理:<UIPickerViewDelegate, UIPickerViewDataSource>

@property (nonatomic, strong) NSArray *degreeArrays;
@property (nonatomic, strong) UIPickerView *degreePickerView;
@property (nonatomic, strong) NSString *degreeString;

// 时间 独用
@property (nonatomic, assign) NSInteger years; // 年
@property (nonatomic, assign) NSInteger months; // 月
@property (nonatomic, assign) NSInteger days; // 日

    _degreePickerView = [[UIPickerView alloc] init];
    _degreePickerView.delegate = self;
    _degreePickerView.dataSource = self;
    _degreePickerView.showsSelectionIndicator = YES;
    [self.degreeContentView addSubview:_degreePickerView];
    [self.degreePickerView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(self.degreeContentView).insets(UIEdgeInsetsMake(self.view.frame.size.width/750*100, 0, self.view.frame.size.width/750*10, 0));
    }];

    // 设置pickerView背景,原理:pickerView背景色透明,在pickerView下边加一个带颜色的UIview
    UIView  *pickerBackView = [[UIView alloc] init];
    pickerBackView.backgroundColor = RGBA(0, 0, 0, 0.4);
    pickerBackView.layer.masksToBounds = YES;
    pickerBackView.layer.cornerRadius = [UIScreen mainScreen].bounds.size.width/375*4;
    [self.backView insertSubview:pickerBackView belowSubview:self.pickerView];
    [pickerBackView makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(self.pickerView);
        make.left.mas_equalTo(self.pickerView.mas_left).offset([UIScreen mainScreen].bounds.size.width/375*20);
        make.right.mas_equalTo(self.pickerView.mas_right).offset(-[UIScreen mainScreen].bounds.size.width/375*20);
        make.height.mas_equalTo([UIScreen mainScreen].bounds.size.width/375*40);
    }];
    
    /* // 添加图片或UIView:
    _selectTopIcon = [[UIImageView alloc] init];
    self.selectTopIcon.image = [UIImage imageNamed:@"pickerView_selected_dottedLine_icon"];
    [self.pickerView addSubview:self.selectTopIcon];
    [self.selectTopIcon makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.pickerView.centerY).offset(-[UIScreen mainScreen].bounds.size.width/375*19);
        make.left.mas_equalTo(self.pickerView.mas_left).offset([UIScreen mainScreen].bounds.size.width/375*0);
        make.right.mas_equalTo(self.pickerView.mas_right).offset(-[UIScreen mainScreen].bounds.size.width/375*0);
        make.height.mas_equalTo([UIScreen mainScreen].bounds.size.width/375*2);
    }];
    
    _selectBottomIcon = [[UIImageView alloc] init];
    self.selectBottomIcon.image = [UIImage imageNamed:@"pickerView_selected_dottedLine_icon"];
    [self.pickerView addSubview:self.selectBottomIcon];
    [self.selectBottomIcon makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.pickerView.centerY).offset([UIScreen mainScreen].bounds.size.width/375*19);
        make.left.mas_equalTo(self.pickerView.mas_left).offset([UIScreen mainScreen].bounds.size.width/375*0);
        make.right.mas_equalTo(self.pickerView.mas_right).offset(-[UIScreen mainScreen].bounds.size.width/375*0);
        make.height.mas_equalTo([UIScreen mainScreen].bounds.size.width/375*2);
    }];
    */

UIButton *confirmButton = [UIButton buttonWithType:UIButtonTypeCustom];
    confirmButton.titleLabel.textAlignment = NSTextAlignmentCenter;
    confirmButton.titleLabel.font = [UIFont systemFontOfSize:([UIScreen mainScreen].bounds.size.width / 375)*18 weight:UIFontWeightRegular];
    [confirmButton setTitle:@"确定" forState:UIControlStateNormal];
    [confirmButton setTitleColor:RGB(27, 167, 19, 1) forState:UIControlStateNormal];
    [self.degreeContentView addSubview:confirmButton];
    [confirmButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.degreeContentView.mas_top).offset(self.view.frame.size.width/750*50);
        make.right.mas_equalTo(self.degreeContentView).offset(-self.view.frame.size.width/750*70);
        make.width.mas_equalTo(self.view.frame.size.width/750*100);
    }];
    [confirmButton addTarget:self action:@selector(confirmDegree) forControlEvents:UIControlEventTouchUpInside];
    
    
    UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
    cancelButton.titleLabel.textAlignment = NSTextAlignmentCenter;
    cancelButton.titleLabel.font = [UIFont systemFontOfSize:([UIScreen mainScreen].bounds.size.width / 375)*18 weight:UIFontWeightRegular];
    [cancelButton setTitle:@"取消" forState:UIControlStateNormal];
    [cancelButton setTitleColor:[UIColor colorWithWhite:0.494 alpha:1] forState:UIControlStateNormal];
    [self.degreeContentView addSubview:cancelButton];
    [cancelButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(confirmButton);
        make.left.mas_equalTo(self.degreeContentView).offset(self.view.frame.size.width/750*70);
        make.width.mas_equalTo(self.view.frame.size.width/750*100);
    }];
    [cancelButton addTarget:self action:@selector(cancelDegree) forControlEvents:UIControlEventTouchUpInside];

//  当 返回数据为nil时,用当前时间戳; 否则,用返回来的数据: self.timeString

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"YYYY-MM-dd"];
        NSDate *datenow = [NSDate date];
        //----------将nsdate按formatter格式转成nsstring
        NSString *currentTimeString = [formatter stringFromDate:datenow];
        NSLog(@"当前的时间戳为: %@", currentTimeString);
        
        NSLog(@"self.timeString = %@", self.timeString);
        NSString *dateString = @"2019-10-12";   //  在这里,每次显示当前显示的时间(在这里固定了),应该将其写为:self.timeString
        if (self.timeString.length > 0) {
            dateString = self.timeString;
        } else {
            dateString = currentTimeString; // 当 返回的数据没有出生日期时,点击时间选择器,则以当前时间为显示时间
        }
        NSArray *array = [dateString componentsSeparatedByString:@"-"];
        self.years = ((NSString *)array[0]).integerValue;
        self.months = ((NSString *)array[1]).integerValue;
        self.days = ((NSString *)array[2]).integerValue;
        
        //  再次点击的时候,会停在 当前显示的时间
        [_degreePickerView selectRow:self.years - 1919 inComponent:0 animated:NO];
        [_degreePickerView selectRow:self.months - 1 inComponent:1 animated:NO];
        [_degreePickerView selectRow:self.days - 1 inComponent:2 animated:NO];
代理方法:
#pragma mark -- UIPickerView    DataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    //  该方法的返回值决定该控件包含的列数
    
    NSInteger column = 0;
    column = 3; // 时间选择器的列
    return column;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    //  该方法的返回值决定该控件指定列包含多少个列表项
    
    
    if (self.cellIndexPath.row == 3) {
        return self.degreeArrays.count; //  学历
    } else {    //  出生日期
        if (component == 0) {
            return 181;       //  1919年 -- 2099年
        } else if (component == 1) {
            return 12;
        } else {
            NSInteger day = 31;
            if (self.months == 1 || self.months == 3 || self.months == 5 || self.months == 7 || self.months == 8 || self.months == 10 || self.months == 12) {
                day = 31;
            } else if (self.months == 4 || self.months == 6 || self.months == 9 || self.months == 11) {
                day = 30;
            } else {
                if ((self.years % 4 == 0 && self.years % 100 != 0)  ||  self.years % 400 == 0) {
                    day = 29;
                } else {
                    day = 28;
                }
            }
            if (self.days > day) {
                self.days = day;
            }
            return day;
        }
        
    }
    
}



#pragma mark -- UIPickerView    Delegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    //  该方法的返回的NSString将作为UIPickerView中指定列和列表项的标题文本
    if (self.cellIndexPath.row == 3) {
        return [self.degreeArrays objectAtIndex:row];
    } else {
        if (component == 0) {
            return [NSString stringWithFormat:@"%ld年", row + 1919];
        } else if (component == 1) {
            return [NSString stringWithFormat:@"%ld月", row + 1];
        } else {
            return [NSString stringWithFormat:@"%ld日", row + 1];
        }
    }
}

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated {
    
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    //  当选择某一列中的某一行的时候,会调用该方法(每滚动到一个地方就会调用一次)
    
    if (self.cellIndexPath.row == 3) {
        _degreeString = [self.degreeArrays objectAtIndex:row];
    } else {
        if (component == 0) {               // 刷新 年
            self.years = 1919 + row;
            [pickerView reloadComponent:2];
        } else if (component == 1) {        // 刷新 月
            self.months = row + 1;
            [pickerView reloadComponent:2];
        } else {                            // 刷新 日
            self.days = row + 1;
        }
        
        //  将时间拼接起来
        NSString *str1 = [NSString stringWithFormat:@"%ld", self.years];
        NSString *str2 = [NSString stringWithFormat:@"%ld", self.months];
        NSString *str3 = [NSString stringWithFormat:@"%ld", self.days];
        NSArray *arr = @[str1, str2, str3];
        self.timeString = [arr componentsJoinedByString:@"-"];
        
        NSLog(@"选择时间 = %@", self.timeString);
        
        
    }
}



- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    //  设置组件的宽度
    if (self.cellIndexPath.row == 3) {
        return self.view.frame.size.width;
    } else {
        if (component == 0 || component == 2) {
            return self.view.frame.size.width / 3 - 20;
        } else {
            return self.view.frame.size.width / 3 - 50;
        }
    }
}

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
    //  设置组件中每一行的高度
    return self.view.frame.size.width/750*100;
}


//  点击阴影部分,退出UIPickerView
- (void)backgroundViewHidden {
    [self exitDegreeFunction];
}

//  选择器(文化程度)

- (void)confirmDegree {
    
    [self exitDegreeFunction];
    
    
    [self.tableView reloadData];    // 点击“确定”刷新tableView
    
}

- (void)cancelDegree {
    
    [self exitDegreeFunction];      //  点击“取消”,就不用刷新tableView
}

//  隐藏PickerView
- (void)exitDegreeFunction {
    
    [UIView animateWithDuration:0.3 animations:^{
        
        self.degreeContentView.transform = CGAffineTransformMakeTranslation(0.01, self.view.frame.size.height);
        self.backgroundView.hidden = YES;
        
    } completion:^(BOOL finished) {
        
        [self.backgroundView removeFromSuperview];
        [self.degreeContentView removeFromSuperview];
        
    }];
    
}

相关文章

网友评论

      本文标题:UIPickerView 设置 时间选择器

      本文链接:https://www.haomeiwen.com/subject/ijflcrtx.html