Xcode: UIPickerView Изменить цвет фона отдельной строки
У меня есть UIPickerView с 3 компонентами (или столбцами), и каждый столбец имеет различное количество строк или элементов. Мне нужно иметь возможность установить цвет фона для каждой строки. Я немного покопался и нашел что-то, что почти работает, но не совсем то, что мне нужно:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
CGRect imageFrame = CGRectMake(0.0, 0.0, 15, 15);
UIImageView *label = [[[UIImageView alloc] initWithFrame:imageFrame] **autorelease**];
if (row == 0)
{
label.backgroundColor = [UIColor redColor];
}
if (row == 1)
{
label.backgroundColor = [UIColor blueColor];
}
if (row == 2)
{
label.backgroundColor = [UIColor blackColor];
}
return label;
}
Приведенный выше код обрабатывает каждый компонент / столбец одинаково и присваивает одинаковую цветовую последовательность каждой строке. Так, например:
Столбец 1 будет иметь: красный / синий / черный Столбец 2 будет иметь: красный / синий / черный Столбец 3 будет иметь: красный / синий / черный
Мне нужно иметь возможность использовать уникальные цветовые последовательности для каждого столбца. Мне не нужно, чтобы каждый столбец имел одинаковую последовательность цветов, как указано выше. Так, например, у меня может быть что-то вроде следующего:
Колонка 1: красный / зеленый / черный Колонка 2: синий / фиолетовый / красный / желтый Колонка 3: белый / красный
2 ответа
Если я вас правильно понимаю, вам нужно включить компонент. Например:
- (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view {
CGRect imageFrame = CGRectMake(0.0, 0.0, 15, 15);
UIImageView *label = [[[UIImageView alloc] initWithFrame:imageFrame] **autorelease**];
switch (component) {
//I'm using enumeration types for the components because its pretty
case THIRD_COMPONENT:
if (row == 0)
{
label.backgroundColor = [UIColor whiteColor];
}
if (row == 1)
{
label.backgroundColor = [UIColor redColor];
}
break;
case SECOND_COMPONENT:
if (row == 0)
{
label.backgroundColor = [UIColor blueColor];
}
if (row == 1)
{
label.backgroundColor = [UIColor purpleColor];
}
if (row == 2)
{
label.backgroundColor = [UIColor redColor];
}
if (row == 3)
{
label.backgroundColor = [UIColor yellow];
}
break;
case FIRST_COMPONENT:
if (row == 0)
{
label.backgroundColor = [UIColor redColor];
}
if (row == 1)
{
label.backgroundColor = [UIColor blueColor];
}
if (row == 2)
{
label.backgroundColor = [UIColor blackColor];
}
break;
}
return label;
}
Это немного долго и громоздко, но попробуйте и посмотрите, решит ли это вашу проблему. Я мог бы предложить хранить метки с уже установленным backgroundColor в массиве для каждого компонента. Таким образом, вместо всех этих операторов if ваш новый оператор switch будет выглядеть так:
switch (component) {
case THIRD_COMPONENT:
label = [thirdBandColorsArray objectAtIndex:row];
break;
case SECOND_COMPONENT:
label = [secondBandColorsArray objectAtIndex:row];
break;
case FIRST_COMPONENT:
label = [firstBandColorsArray objectAtIndex:row];
break;
}
Мне пришлось сделать что-то похожее на то, что вы описываете в одном из моих приложений, и именно так я это и сделал. Как я уже сказал, это всего лишь предложение. Надеюсь это поможет.
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *label = (UILabel*) view;
if (label == nil) {
label = [[UILabel alloc] init];
}
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor setAnyRandomColor];
CGSize rowSize = [pickerView rowSizeForComponent:component];
CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
[label setFrame:labelRect];
return label;
}