滚动选择器。
遵守协议
<UIPickerViewDataSource,UIPickerViewDelegate>
,用法类似于UITableView
一样,需要设置数据源。
创建,布局
UIPickerView * _pkView = [[UIPickerView alloc] init];
_pkView.frame = CGRectMake(0, 50, SCREEN_W, 220);
_pkView.backgroundColor = [UIColor whiteColor];
_pkView.delegate = self;
_pkView.dataSource = self;
[_containView addSubview:_pkView];
实现数据源方法
1、指定列数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return self.dataArray.count;
}
2、指定每一列的行数
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
NSArray *arr = self.dataArray[component];
return arr.count;
}
3、每一行的数据(文字显示)
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
NSArray *arr = self.dataArray[component];
NSString *str = [arr objectAtIndex:row];
return str;
}
如果需要特殊样式,用以下方法添加富文本
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{
NSString *titleString = self.dataArray[component][row];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:titleString];
NSRange range = [titleString rangeOfString:titleString];
[attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
return attributedString;
}
4、如果需要自定义每一行的子控件。可以用UILabel
来设置字体大小 和背景颜色
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{
//设置分割线的颜色
for(UIView *singleLine in pickerView.subviews) {
if (singleLine.frame.size.height < 1)
singleLine.backgroundColor = [UIColor redColor];
}
UILabel *pickerLabel = (UILabel*)view;
if (!pickerLabel) {
pickerLabel = [UILabel labelWithText:@"" Font:18 TextColor:[UIColor blackColor]];
}
if (row == [pickerView selectedRowInComponent:component] ) {
// 选中样式
pickerLabel.attributedText = [self pickerView:pickerView attributedTitleForRow:row forComponent:component];
}else
pickerLabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];
return pickerLabel;
}
设置行高
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
return 40;
}
设置每一列占的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
if (component==0) return 70.0;
if (component==1) return 80.0;
return 90;
}
代理方法
每一列选中时回调
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
// 在这里 处理业务逻辑....
if (component==0) section0_index = row;
if (component==1) section1_index = row;
if (component==2) section2_index = row;
NSLog(@"row is %ld, Component is %ld",row,(long)component);
}
设置数据源,刷新
列数行数都是由数据决定
-(void)setDataSource{
self.arr1 = @[@"1",@"2",@"3",@"4",@"5"];
self.arr2 = @[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L"];
self.arr3 = @[@"一",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"十" ];
self.dataArray = [NSMutableArray arrayWithObjects:self.arr1,self.arr2, self.arr3, nil];
// 刷新所有列
[self.pkView reloadAllComponents];
}
常用方法
刷新某一列的数据
[pickerView reloadComponent:1];
滚动到(选中)某行
[self.pkView selectRow:12 inComponent:1 animated:NO];
获取某列选中的row
NSUInteger row = [self.pkView selectedRowInComponent:0];
获取row的size
CGSize size = [self.pickerView rowSizeForComponent:0]
返回指定列的列表项所使用的UIView控件
UIView *pickview=[self.pickerView viewForRow:0 forComponent:0];