PickerView使用及实现自定义时间选择

UIPickerView 是一个选择器控件,可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活,可多行展示的滚动视图,UIPickerView 继承自 UIView。

最近工作不是很忙,就跟一朋友提出需求(时分选择,根据要求设置可选与不可选小时和分钟),本来想着使用UIDatePicker,但是自定义显示,使用UIPickerView比较方便,UIPickerView的使用与UITableView比较相似。


1,常用代理方法

//返回有几列
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
    return 40.0f;
}


//返回指定列的行数

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

    if (component == 0)return self.hourArray.count;

    return self.minuteArray.count;

}


//要修改picker滚动里每行文字的值及相关属性,分割线等在此方法里设置

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    //设置分割线的颜色,这里设为隐藏

    for(UIView *singleLine in pickerView.subviews){

        if (singleLine.frame.size.height < 1){

            singleLine.backgroundColor = [UIColor clearColor];

        }

    }

    //设置文字的属性

    UILabel *timeLabel = [UILabel new];

    timeLabel.textAlignment = NSTextAlignmentCenter;

    timeLabel.font = [UIFont systemFontOfSize:24.0];

    timeLabel.textColor =  [UIColor colorWithRed:56/255.0 green:56/255.0 blue:56/255.0 alpha:1.0];

    BOOL isOptional = NO;

    if (component == 0) {

        timeLabel.text = self.hourArray[row];

        if ([self.timeDic.allKeys containsObject:self.hourArray[row]]) {

            isOptional = YES;

        }

    }else{

        timeLabel.text = self.minuteArray[row];

        if ([self.timeDic.allKeys containsObject:self.selectHour]) {

            if ([[self.timeDic objectForKey:self.selectHour] containsObject:self.minuteArray[row]]) {

                isOptional = YES;

            }

        }

    }

    if (!self.timeDic.allKeys.count)  isOptional = YES;

    if (!isOptional) {

        // 横线的颜色跟随label字体颜色改变

        NSMutableAttributedString *newTime = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",timeLabel.text]];

        [newTime addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlinePatternSolid | NSUnderlineStyleSingle) range:NSMakeRange(0, newTime.length)];

        timeLabel.attributedText = newTime;

    }

    return timeLabel;

}


//返回指定列,行的高度,就是自定义行的高度

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{

    return 40.0f;

}


//返回指定列,行的宽度,就是自定义的宽度

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
   
    return CGRectGetWidth(pickerView.frame)/4;
}

这个要说一下, 如果你设置宽度,UIPickerView的row 会根据列数自动平分UIPickerView的宽度,这样当你的列数少的时候,row 就是倾斜的, 要想row不倾斜,就手动设置宽度, 这个宽度不会影响row的触发区域大小。


//row发生改变都会触发这个代理方法,用于获取选择row的值

- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
   
    if (component == 0) {
        self.selectHour = self.hourArray[row];
        [self.pickerView reloadComponent:component + 1];
    }else{
        self.index = row;
    }
   
    [self getHint:self.index];
    self.selectTime = [NSString stringWithFormat:@"%@:%@",self.selectHour,self.minuteArray[self.index]];
}


设置滚动到某列某个row 是否有动画效果

  [self.pickerView selectRow:9 inComponent:0 animated:YES];


刷新方法

[self.pickerView reloadComponent:1];//刷新某列 

[self.pickerView reloadAllComponents];//刷新所有列


demo地址

你可能感兴趣的:(PickerView使用及实现自定义时间选择)