Estou implementando uma exibição de tabela de seleção de cores em que o usuário pode selecionar, por exemplo, 10 cores (depende do produto). O usuário também pode selecionar outras opções (como capacidade do disco rígido, ...).
Todas as opções de cores estão dentro de sua própria seção de tableview.
Quero exibir um pequeno quadrado à esquerda do textLabel mostrando a cor real.
No momento, estou adicionando um UIView quadrado simples, fornecendo a cor de fundo correta, desta forma:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Isso é exibido sem problemas.
Meu único problema é que, quando seleciono uma linha "colorida", durante a animação de seleção de desbotamento para azul, meu UIView personalizado (colorThumb) fica oculto. Torna-se visível novamente logo após o término da animação de seleção / desmarcação, mas isso produz um artefato feio.
O que devo fazer para corrigir isso? Não insiro a subvisão no lugar certo?
(Não há nada de especial no didSelectRowAtIndexPath, basta alterar o acessório da célula para uma caixa de seleção ou nada e desmarcar o indexPath atual).
fonte
Respostas:
UITableViewCell
muda a cor de todos os pontos de vista sub fundo quando a célula é selecionada ou destacado, você pode resolver este problema, substituindo célula TableviewsetSelected:animated
esetHighlighted:animated
e redefinir cor fundo vista.No objetivo C:
No Swift 3.1:
fonte
if (highlighted)
eif (selected)
? Eu acho que vai funcionar se não tivermos essas condições.É porque a célula de exibição de tabela altera automaticamente a cor de plano de fundo de todas as visualizações na exibição de conteúdo para o estado destacado. Você pode considerar a subclasse
UIView
para desenhar sua cor ou usar umaUIImageView
imagem esticada personalizada de 1x1 px.fonte
setHighlighted:animated:
esetSelected:animated:
Encontrei uma solução bastante elegante em vez de mexer nos métodos de seleção / destaque tableViewCell. Você pode criar uma subclasse do UIView que ignore a configuração da cor do plano de fundo para limpar a cor.
Swift 3/4:
Swift 2:
Versão Obj-C:
fonte
Outra maneira de gerenciar o problema é preencher a visualização com gradiente de gráficos principais, como:
fonte
Para o Swift 2.2, isso funciona
e a razão é explicada por @ Andriy
fonte
Inspirado por Yatheesha BL 's resposta eu criei um UITableViewCell categoria / extensão que lhe permite ligar e desligar esse 'recurso' transparência.
Rápido
Objetivo-C
KeepBackgroundCell é compatível com CocoaPods. Você pode encontrá-lo no GitHub
fonte
Você pode
cell.selectionStyle = UITableViewCellSelectionStyleNone;
definir o backgroundColor como- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
fonte
Inspirado pela resposta de Yatheesha BL .
Se você chamar super.setSelected (selecionado, animado: animado), ele limpará toda a cor de fundo que você definir . Portanto, não chamaremos super método.
Em Swift:
fonte
Para maiúsculas e minúsculas, estas são as tentativas para evitar a cor cinza de todos os itens da célula (caso você esteja usando a célula de exibição de tabela personalizada):
Defina o SelectionStyle para .none 👉
selectionStyle = .none
Substitua esse método.
Ligue para o super, para obter o benefício da super configuração.
Faça o que sempre destacando a lógica que você deseja.
fonte
UITableViewCell altera o backgroundColor de todas as subvisões na seleção por algum motivo.
Isso pode ajudar:
DVColorLockView
Use algo assim para impedir que o UITableView altere a cor da exibição durante a seleção.
fonte
Desenhe a vista em vez de definir a cor de fundo
fonte
Solução MAIS SIMPLES sem bugs com animação (como na resposta mais votada) e sem subclassificação e desenho - defina a cor da borda da camada em vez de backgroundColor e defina uma largura de borda muito grande.
fonte
Tente o seguinte código:
fonte
Não se esqueça de substituir
setSelected
, bem comosetHighlighted
fonte
Isso é semelhante à resposta de Pavel Gurov, mas mais flexível na medida em que permite que qualquer cor seja permanente.
fonte
Eu queria manter o comportamento de seleção padrão, exceto uma subvisão de célula que desejava ignorar a alteração automática da cor de fundo. Mas eu também precisava mudar a cor do plano de fundo em outros momentos.
A solução que encontrei foi a subclasse,
UIView
para que ela ignore a configuração da cor de fundo normalmente e adicione uma função separada para ignorar a proteção.Swift 4
fonte
Aqui está a minha solução, use contentView para mostrar a seleçãoColor, ele funciona perfeitamente
fonte
Coloque esse código na sua subclasse de
UITableViewCell
Sintaxe do Swift 3
fonte
Adicionando outra solução se você estiver usando storyboards. Crie uma subclasse
UIView
que não permita que elabackgroundColor
seja configurada depois de configurada inicialmente.fonte
Se a solução em segundo plano mencionada acima não estiver solucionando o problema, seu problema poderá estar presente no
datasource
seu tableView.Para mim, eu estava criando uma instância de um objeto DataSource (chamado
BoxDataSource
) para manipular os métodos delegate e dataSource tableView, da seguinte maneira:Isso fazia com que o dataSource fosse desalocado sempre que a célula era tocada e, portanto, todo o conteúdo desaparecia. O motivo é que a ARC está desalocando / coletando a natureza.
Para corrigir isso, eu tive que ir para a célula personalizada, adicionar uma variável de fonte de dados:
Em seguida, é necessário definir o dataSource para o dataSource da célula que
var
você acabou de criar no cellForRow, para que isso não seja desalocado com o ARC.Espero que ajude.
fonte