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;
}
Другие вопросы по тегам