UIPickerView的使用

2020-02-27  本文已影响0人  Arthur澪

滚动选择器。

遵守协议

<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];
上一篇 下一篇

猜你喜欢

热点阅读