Pergunta

Eu gostaria de personalizar o fundo (e talvez a fronteira também) de todos os UITableViewCells dentro do meu UITableView. Até agora eu não tenho sido capaz de personalizar essas coisas, então eu tenho um monte de brancos células de fundo que é o padrão.

Existe uma maneira de fazer isso com o iPhone SDK?

Foi útil?

Solução

Você precisa definir o backgroundColor de contentView da célula a sua cor. Se você usar acessórios (como setas de divulgação, etc.), eles vão aparecer como branco, assim você pode precisar de versões personalizadas do rolo daqueles.

Outras dicas

Aqui é a maneira mais eficiente que se deparam para resolver este problema, use o método delegado willDisplayCell (este cuida da cor branca para o rótulo fundo do texto, bem como quando usando cell.textLabel.text e / ou celular. detailTextLabel.text):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Quando este método delegado é chamado a cor da célula é controlado através do celular em vez da exibição de tabela, como quando você usa:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

Assim, dentro do corpo do método delegado celular adicione o seguinte código para cores alternadas de células ou simplesmente usar a chamada de função para fazer todas as células da tabela da mesma cor.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Esta solução funcionou bem em minha circunstância ...

Isto é realmente simples, desde OS 3.0 apenas definir a cor da célula no método willDisplayCell fundo. Você não deve definir a cor no cellForRowAtIndexPath.

Isso funciona tanto para o estilo simples e agrupados:

Código:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

P.S: Aqui o extrato de documentação para willDisplayCell:

"exibir uma tabela envia esta mensagem para seu delegado, pouco antes ele usa celular para desenhar uma linha, permitindo assim o delegar para personalizar o objeto celular antes de ser exibido. Este método dá o delegado a chance de substituir baseado no estado propriedades conjunto anteriormente pela exibição de tabela, tais como seleção e cor de fundo. Depois de O delegado devoluções, a vista mesa define apenas o alfa e quadro propriedades, e, em seguida, apenas quando animando linhas como eles deslizar ou fora ".

Eu encontrei esta informação no este postar a partir colionel . Agradecê-lo!

A melhor abordagem que eu encontrei até agora é definir uma visão da célula e fundo claro de subviews celulares fundo. Claro, isso parece bom em tabelas com único estilo indexado, não importa com ou sem acessórios.

Aqui está um exemplo onde fundo da célula é ofegante amarelo:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

Basta colocar isso em você uitableview delegar arquivo de classe (.m):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

Concordo com Seba, Tentei definir a minha cor de linha alternada no método rowForIndexPath delegado, mas estava ficando resultados inconsistentes entre 3,2 e 4,2. O seguinte trabalhou muito para mim.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

Depois de experimentar todas as soluções diferentes, o seguinte método é o mais elegante. Alterar a cor da seguinte método delegado:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

vlado.grigorov tem alguns bons conselhos - a melhor maneira é criar um backgroundView, e que dão uma cor, ajustar tudo outro ao clearColor. Além disso, acho que maneira é a única maneira de limpar corretamente a cor. (Tentar sua amostra - mas set 'clearColor' em vez de 'yellowColor'), que é o que eu estava tentando fazer

Personalizar o fundo de uma célula de exibição de tabela, eventualmente, torna-se e "tudo ou nada" abordagem. É muito difícil mudar a cor ou a imagem usada para o fundo de uma célula de conteúdo de uma forma que não parece estranho.

A razão é que a célula na verdade abrange a largura da vista. Os cantos arredondados são apenas parte de seu estilo de desenho e visualização de conteúdo senta nesta área.

Se você alterar a cor da célula conteúdo que você vai acabar com pedaços brancos visíveis nos cantos. Se você alterar a cor de toda a célula, você terá um bloco de cor que mede a largura da vista.

Você pode definitivamente customizar uma célula, mas não é tão fácil como você pode pensar à primeira vista.

Criar uma vista e definir isso como vista de fundo da célula

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

Para estender a resposta de N.Berendt - Se você quiser cor da célula conjunto com base em algum estado no objeto de dados celular real, no momento em que você estiver configurando o resto da informação para a célula da tabela, que normalmente é quando você são no método cellForRowAtIndexPath, você pode fazer isso, substituindo o método willDisplayCell para definir a cor de fundo da célula a partir da cor fundo vista de conteúdo - isso fica em torno da questão do botão divulgação fundos etc. não estar certo, mas ainda permite que você controle a cor em o método cellForRowAtIndexPath onde você está fazendo tudo de sua outra personalização celular.

Assim: Se você adicionar esse método para o delegado exibição de tabela:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

Em seguida, em seu método cellForRowAtIndexPath você pode fazer:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Este evita ter de recuperar objetos seus dados novamente no método willDisplayCell e também evita ter dois lugares onde você alfaiataria / personalização de sua célula da tabela -. Toda a personalização pode ir no método cellForRowAtIndexPath

Criar uma imagem para uso como o fundo com o Photoshop ou Gimp e nomeá-la myimage. Em seguida, adicione este método para sua classe tableViewController:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

Isto irá funcionar, também, se você tiver definido o UITableView com o costume no inspetor atributo.

A minha solução é adicionar o seguinte código ao evento cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

Funciona em qualquer circunstância, mesmo com botões de divulgação, e é melhor para a sua lógica para agir em estado de células de cor em cellForRowAtIndexPath do que no evento cellWillShow eu acho.

subclasse UITableViewCell e adicione na implementação:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];

Isto irá funcionar na última Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

Tente isto:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top