Проблема с прозрачным фоном текста в UITableView

У меня есть раздражающая проблема в моем табличном представлении. Мне удалось получить ячейки, меняющие цвет (синий/белый/синий/...), но теперь у меня проблемы с моим текстом, который имеет белый фон на синих ячейках.

Я попытался для тестирования установить красный цвет фона:

// try to set the backgroundcolor of the text ???
cell.textLabel.text.backgroundColor = [UIColor redColor];

что не работает; хм.

Пожалуйста, взгляните на мой код ниже; кто-нибудь может сказать мне, что не так и как я могу решить свою проблему, придав тексту прозрачный фон?


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
             cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell
    cell.textLabel.text=[RssFeedNodes objectAtIndex:indexPath.row];

    // try to set the backgroundcolor of the text ???
    cell.textLabel.text.backgroundColor = [UIColor redColor];


    // show image in cell
    NSString *imageName=@"rss.png";
    cell.imageView.image=[UIImage imageNamed:imageName];

    // changing colors in cells
    NSInteger row = [indexPath row];
    if (row % 2){ 
        cell.contentView.backgroundColor = [UIColor whiteColor];
    }
    else { 
        cell.contentView.backgroundColor = [UIColor colorWithRed:0.90f green:0.95f blue:1.0f alpha:1.0f];
    }

    return cell;
}

person michbeck    schedule 05.12.2009    source источник


Ответы (4)


Ваш ответ находится (и очень хорошо описан) здесь: http://undefinedvalue.com/2009/11/02/easy-gradient-backgrounds-uitextviewcells

Мое краткое изложение решения: создайте подкласс UITableViewCell, а затем используйте свой подкласс при создании экземпляров в cellForRowAtIndexPath.

Затем вам нужно переопределить только один метод (setSelected) в вашем подклассе UITableViewCell:

  • (void) setSelected: (BOOL) выбранный анимированный: (BOOL) анимированный {

    [super setSelected: выбранный анимированный: анимированный];

    // Настроить представление для выбранного состояния for (UIView *view in self.contentView.subviews) { view.backgroundColor = [UIColor clearColor]; } }

Причина, по-видимому, заключается в том, что встроенный класс UITableViewCell установит белый фон метки (или выбранный цвет) при отображении на основе состояния выбора в таблице в методе setSelected. Замените свой собственный, вызовите реализацию базового класса, затем установите фон вашего подпредставления на очистку, чтобы ваш фон contentView просвечивал.

person Bill    schedule 30.12.2009

text не имеет фона, но textLabel имеет. так

[[cell textLabel] setBackground:[UIColor redColor]];
person Morion    schedule 05.12.2009
comment
спасибо, я уже пробовал это, похожее на ваше решение: cell.textLabel.backgroundColor = [UIColor redColor]; ваше предложение: [[cell textLabel] setBackgroundColor: [UIColor redColor]]; не работает в моем коде, также нет цвета фона для моих текстовых меток :-( - person michbeck; 05.12.2009

Вам нужно будет добавить свою собственную метку UILabel в ячейку и установить для нее прозрачный цвет фона. По какой-то причине метка, которую имеет ячейка таблицы, не имеет устанавливаемого цвета фона.

Что-то типа:

UILabel* label = [[UILabel alloc] init];
label.frame = CGRectMake( 20, 10, 200, 22 );
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;        
label.text = @"your text here:";
[cell addSubview:label];
[label release];

В этом примере я установил рамку для метки довольно произвольно (на самом деле нет, это было изменено из моего собственного реального кода). Возможно, вам придется быть более динамичным с размером, и в этом случае вам, вероятно, потребуется создать подкласс ячейки и переопределить setFrame, чтобы синхронизировать рамку метки. Но жестко заданные значения должны помочь вам на данный момент.

person philsquared    schedule 05.12.2009
comment
Спасибо, Фил, не могли бы вы показать мне, как это сделать на моем примере? у меня довольно начальные трудности в задаче c - person michbeck; 05.12.2009
comment
И как только вы используете свой собственный UITextField, вы, вероятно, можете просто установить его фоновый цвет на [UIColor clearColor] (т.е. вообще без цвета) - person wkw; 05.12.2009
comment
добавлен пример. Я также понял, что в спешке ранее я упомянул UITextField, когда я должен был говорить о UILabel - person philsquared; 05.12.2009
comment
Привет, Фил, Морион и wkw, большое спасибо за помощь, теперь все работает с Uilabel :-) - person michbeck; 06.12.2009
comment
michbeck - рад, что это помогло. В этом случае будет вежливо, если вы проголосуете за полезные ответы :-) - person philsquared; 07.12.2009

#define LABEL_TAG 99
    // whatever your label rect size should be... change as appropriate
    UIlabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300.0, 30.0)]; 
    label.tag = LABEL_TAG;
    // set up alignment, font, autoresizemask, etc.
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
    [cell.contentView addSubview:label];
    [label release];

На что следует обратить внимание, так это на то, что вы не добавляете свою собственную метку в повторно используемую ячейку таблицы более одного раза. Установив известное свойство view.tag, вы можете получить (или обнаружить) представление UILabel. [cell viewWithTag:LABEL_TAG]

Всякий раз, когда вы удаляете из очереди повторно используемую ячейку, сначала получите ссылку на представление метки, а затем сделайте то, что вы обычно делаете, если используете textLabel UITableCell.

person wkw    schedule 05.12.2009