Como alterar a cor de destaque azul de um UITableViewCell?

131

Eu estou querendo saber como alterar a cor do realce / seleção azul de a UITableViewCell, alguma idéia?

Thomas Joos
fonte

Respostas:

213

Você pode alterar a cor de destaque de várias maneiras.

  1. Altere a propriedade selectionStyle do seu celular. Se você mudar para UITableViewCellSelectionStyleGray, ficará cinza.

  2. Mude a selectedBackgroundViewpropriedade. Na verdade, o que cria o gradiente azul é uma visualização. Você pode criar uma visualização e desenhar o que quiser e usar a visualização como plano de fundo das células da visualização da tabela.

zonble
fonte
8
legal, encontrei uma boa explicação e exemplo aqui: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
Percebi que no IB você não pode definir a "Seleção" do UITableViewCell como "Nenhuma" - porque selectedBackgroundViewsimplesmente nunca aparecerá. Somente após definir "Seleção" como Padrão, a selectedBackgroundViewexibição será exibida. Testado em iOS 6 e 7.
Jonny
12
Obrigado pela excelente nota! Isto torna tão simples agora: você criar uma nova vista (não é necessário até especificar a estrutura: cell.selectedBackgroundView = [UIView new];e você definir qualquer cor que você quiser:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P
veja o final desta página, há abordagens mais recentes
Climbatize
145

O Zonble já forneceu uma excelente resposta. Eu pensei que seria útil incluir um trecho de código curto para adicionar um UIViewà célula de tableview que será apresentada como a exibição de plano de fundo selecionada.

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • celular é meu UITableViewCell
  • Criei um UIView e defina sua cor de fundo usando cores RGB (cinza claro)
  • Em seguida, defino a célula selectedBackgroundViewcomo a UIViewque eu criei com a cor de fundo escolhida

Isto funcionou bem para mim. Obrigado pela dica Zonble.

T Davey
fonte
2
Isso não funciona muito bem ao usar visualizações de tabela com seções. Quando selecionada, a célula perde as bordas e não é arredondada quando a primeira ou a última célula.
Kirk Woll
7
@kirk, você quer dizer agrupados :)
Tieme
@ Tieme, não, quero dizer seções : "Uma exibição de tabela é composta de zero ou mais seções, cada uma com suas próprias linhas".
precisa
Você deve colocá-lo dentro do 'cellForRowAtIndexPath'. Funciona bem para mim, com uma seção. Não tentei com várias seções.
Vincent
Um pouco tarde para o jogo, mas eu posso confirmar que funciona em um tableview com várias seções (não-agrupados)
matto0
30

UITableViewCell possui três estilos de seleção padrão: -

  1. Azul
  2. cinzento
  3. Nenhum

A implementação é a seguinte: -

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Arshad Parwez
fonte
7
em vez desses três estilos padrão, também podemos personalizar o estilo esperado pela propriedade selectedBackgroundView.
Sunil Targe
Trabalhou para mim ... Muito obrigado.
Mujeeb Farooqi
19

No Swift, use isso em cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

Se você quer sua cor de seleção ser o mesmo em todos os UITableViewCell, usar isso em AppDelegate.

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView
alitosuner
fonte
18

Se você quiser alterá-lo para todo o aplicativo, adicione a lógica ao seu Delegado de Aplicativo

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}
NatashaTheRobot
fonte
Perfeito. Alguma idéia de como definir a cor do texto dessa célula padrão globalmente em select?
precisa saber é o seguinte
1
isso funciona, mas a seleção é limpa diretamente ao pressionar o novo controlador de exibição.
bobmoff
Ótima maneira de fazer mudanças globais para UITableViewCell
Shashi3456643
12

para completar: se você criou sua própria subclasse, UITableViewCellpode implementar o - (void)setSelected:(BOOL)selected animated:(BOOL)animatedmétodo e definir a cor de segundo plano de alguma visualização que você adicionou na visualização de conteúdo. (se for esse o caso) ou do próprio contentView (se não for coberto por uma de suas próprias visualizações).

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(não usou? para ajustar-se à pequena largura dos DIVs do código-fonte :)

essa abordagem tem duas vantagens em relação ao uso do selectedBackgroundView, usa menos memória e um pouco menos de CPU, não que você notaria a menos que exibisse centenas de células.

Martijn Scheffer
fonte
Isso funciona somente depois que uma nova exibição é atribuída ao selectedBackgroundView addself. selectedBackgroundView = [UIView new];
enadun
@enadun Este método funciona para mim no iOS 12, sem nenhuma configuração da selectedBackgroundViewpropriedade.
Nate
11

Preciso definir o estilo de seleção para que UITableViewCellSelectionStyleDefaulta cor de plano de fundo personalizada funcione. Se houver outro estilo, a cor de plano de fundo personalizada será ignorada. Testado no iOS 8.

O código completo da célula da seguinte maneira:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];

    return cell;
}
samwize
fonte
6

Com base na resposta do usuário @ , você pode adicionar esta extensão em qualquer lugar no código do seu aplicativo e ter a cor da sua seleção diretamente no editor de storyboard para todas as células do seu aplicativo:

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

Cor de seleção UITableViewCell no storyboard

Climbatize
fonte
5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

No seu storyboard, defina a classe do seu UITableViewCell como UIDesignableTableViewCell, no inspetor Atributos, você pode alterar a cor selecionada da sua célula para qualquer cor.

Você pode usar isso para todas as suas células. É assim que o inspetor de atributos será exibido.

É assim que o seu inspetor de atributos se parecerá

do utilizador
fonte
Muito criativo! ótimo!
Kaushil Ruparelia
você pode torná-lo ainda mais simples, olhar para a minha resposta;) stackoverflow.com/a/51764804/537694
Climbatize
Eu uso uma célula personalizada para definir rótulos, então isso funciona bem, obrigado! Mudança para Swift 5: Agora UIColor.clear, não UIColor.clearColor(). Não tenho certeza se isso também é uma mudança no Swift, mas também funciona sem ele @IBDesignable.
Neph 5/06/19
5

Swift 3.0 / 4.0

Se você criou sua própria célula personalizada, é possível alterar a cor da seleção awakeFromNib()para todas as células:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}
Sam Bing
fonte
0

1- Adicione uma visualização à visualização de conteúdo do seu celular.
2- Clique com o botão direito do mouse no seu celular.
3- Crie a visualização adicionada como "selectedBackgroundView" insira a descrição da imagem aqui

Badr
fonte