Xcode: UIPickerView Изменить цвет фона отдельной строки - PullRequest
2 голосов
/ 21 марта 2012

У меня есть 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 ]

0 голосов
/ 27 января 2017
- (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;
}
0 голосов
/ 26 марта 2012

Если я вас правильно понимаю, вам нужно включить компонент.Например:

- (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;
}

Мне нужно было сделать что-то похожее на то, что вы описываете в одном из моих приложений, и так я и сделал.Это.Как я уже сказал, это всего лишь предложение.Надеюсь, это поможет.

...