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];//刷新所有列