Можно ли предоставить UIView для UIPickerView, который «заполняет» строку? - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь предоставить пользовательские представления для 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 ]

1 голос
/ 04 марта 2011

Хорошо, мне удалось, по крайней мере, "центрировать" вид.

Мне нужно было добавить подпредставление к представлению, которое возвращается из 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;
}

По какой-то причине мне не удалось расширить вид до самых краев ряда, поэтому белые края, появляющиеся по обе стороны от вида, остаются. Я могу жить с этим.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 04 марта 2011
- (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;  
}

«хитрость» заключается в возврате повторного просмотра, если он доступен. После этого вам нужно настроить представление так, как вы хотите.

Значение «320» здесь только для проверки, вместо этого вы должны поместить некоторое вычисленное значение, такое как pickerView.frame.size.width, чтобы код был чище.

...