是否有可能向UIPickerView提供一个“填充”行的UIView?

时间:2011-03-03 17:44:44

标签: iphone uipickerview

我正在尝试为UIPickerView提供自定义视图,以便每行的整个背景是两种颜色中的一种(没有一种是白色)。

我已经能够使用我想要的颜色提供这些自定义视图,但是我不能让视图填充整行的“空间”。

下面的测试代码试图达到将UIPicker的背景颜色更改为绿色的效果 - 但我提供的视图无法正确对齐。它总是在左边几个像素,有时实际上覆盖了组件的左边缘,具体取决于它的宽度。

这样做的结果是我总是在右侧看到白色边缘。

更改CGRect的原点不会更改其在行中的位置。

更改CGRect的宽度会改变宽度,但它仍然始终向左对齐几个像素。即没有居中。

任何人都可以告诉我,我在这里做错了什么?

我只是将一个标准的UIPicker放到视图上。

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
   return 44;
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
   return 200;
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
   UIView *rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 44)] autorelease];
   rowView.backgroundColor = [UIColor greenColor];
   return rowView;  
}

2 个答案:

答案 0 :(得分:1)

好的,我已经设法至少“集中”视图。

我必须在viewForRow返回的视图中添加一个子视图,并为origin.x值尝试一些值,如下所示:

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

    UIView *rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 44)] autorelease];

    UIView *subView = [[[UIView alloc] initWithFrame:CGRectMake(6, 0, 194, 44)] autorelease];
    subView.backgroundColor = [UIColor greenColor];
    [rowView addSubview:subView];

    return rowView;
}

由于某种原因,虽然我无法将视图延伸到行的边缘,因此显示在视图两侧的白色边缘仍然存在。我可以忍受这个。

希望这有助于其他人。

答案 1 :(得分:0)

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

    UIView *rowView = nil;

    if(view==nil) {
        rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
        rowView.backgroundColor = [UIColor greenColor];
        return rowView;
    }


    return view;  
}

“技巧”是返回reusingView(如果可用)。 在此之后,您可以根据需要配置视图。

“320”值只是为了测试你应该改为放置一些计算值,例如pickerView.frame.size.width,这样代码就会更清晰。