Quelqu'un sait-il comment changer la couleur d'arrière-plan d'une cellule à l'aide de UITableViewCell, pour chaque cellule sélectionnée? J'ai créé cette UITableViewCell dans le code de TableView.
La modification de la propriété selectedBackgroundView est correcte et la manière la plus simple. J'utilise le code suivant pour changer la couleur de sélection:
// set selection color
UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1];
cell.selectedBackgroundView = myBackView;
[myBackView release];
J'ai finalement réussi à faire fonctionner cela dans une vue de table avec un style défini sur Groupé.
Définissez d'abord la propriété selectionStyle
de toutes les cellules sur UITableViewCellSelectionStyleNone
.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ensuite, implémentez les éléments suivants dans votre délégué de vue de table:
static NSColor *SelectedCellBGColor = ...;
static NSColor *NotSelectedCellBGColor = ...;
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow];
if (currentSelectedIndexPath != nil)
{
[[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor];
}
return indexPath;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (cell.isSelected == YES)
{
[cell setBackgroundColor:SelectedCellBGColor];
}
else
{
[cell setBackgroundColor:NotSelectedCellBGColor];
}
}
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
if (selected) {
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
}
else {
self.backgroundColor = [UIColor clearColor];
}
}
Après quelques tests, cela [~ # ~] [~ # ~] supprimera la couleur d'arrière-plan lorsqu'il est désélectionné ou que la cellule est tapée une deuxième fois lorsque la vue de la table Sélection est réglé sur "Sélection multiple". Fonctionne également lorsque le style de vue tabulaire est défini sur "Groupé".
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.contentView.backgroundColor = UIColor.darkGray
}
}
}
Remarque: Pour que cela fonctionne comme vous le voyez ci-dessous, la propriété Selection de votre cellule peut être définie sur n'importe quoi MAIS Aucune.
Style: Simple , Sélection: Sélection unique
Style: Simple , Sélection: Sélection multiple
Style: Groupé , Sélection: Sélection multiple
Pour une transition de couleur plus fluide, essayez une animation:
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
UIView.animate(withDuration: 0.3, animations: {
cell.contentView.backgroundColor = UIColor.darkGray
})
}
}
}
Vous pouvez remarquer que l'icône et la couleur du texte changent également lorsque la cellule est sélectionnée. Cela se produit automatiquement lorsque vous définissez les propriétés UIImage et UILabel Highlighted
UIImage
UILabel
Fournissez simplement une couleur pour la propriété surlignée:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor yellowColor];
}
J'ai créé UIView et défini la propriété de la cellule selectedBackgroundView:
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
Si vous parlez de cellules sélectionnées, la propriété est -selectedBackgroundView
. Cela sera affiché lorsque l'utilisateur sélectionnera votre cellule.
Pour iOS7 + et si vous utilisez Interface Builder alors sous-classe votre cellule et implémentez:
Objectif-C
- (void)awakeFromNib {
[super awakeFromNib];
// Default Select background
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = v;
}
Swift 2.2
override func awakeFromNib() {
super.awakeFromNib()
// Default Select background
self.selectedBackgroundView = { view in
view.backgroundColor = .redColor()
return view
}(UIView())
}
J'ai un UITableViewCell hautement personnalisé. J'ai donc implémenté ma propre sélection de cellules.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
J'ai créé une méthode dans la classe de ma cellule:
- (void)highlightCell:(BOOL)highlight
{
if (highlight) {
self.contentView.backgroundColor = RGB(0x355881);
_bodyLabel.textColor = RGB(0xffffff);
_fromLabel.textColor = RGB(0xffffff);
_subjectLabel.textColor = RGB(0xffffff);
_dateLabel.textColor = RGB(0xffffff);
}
else {
self.contentView.backgroundColor = RGB(0xf7f7f7);;
_bodyLabel.textColor = RGB(0xaaaaaa);
_fromLabel.textColor = [UIColor blackColor];
_subjectLabel.textColor = [UIColor blackColor];
_dateLabel.textColor = RGB(0x496487);
}
}
Dans ma classe UITableViewController de ViewWillAppear, j'ai ajouté ceci:
NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];
Dans didSelectRow a ajouté ceci:
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
J'ai eu de la chance avec ce qui suit:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
bool isSelected = // enter your own code here
if (isSelected)
{
[cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]];
[cell setAccessibilityTraits:UIAccessibilityTraitSelected];
}
else
{
[cell setBackgroundColor:[UIColor clearColor]];
[cell setAccessibilityTraits:0];
}
}
J'ai pu résoudre ce problème en créant une sous-classe de UITableViewCell
et en implémentant la méthode setSelected: animated:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if(selected) {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setBackgroundColor:[UIColor greenColor]];
} else {
[self setBackgroundColor:[UIColor whiteColor]];
}
}
L'astuce consistait à
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
dans le contrôleur de vue d'implémentation, puis dans la tableViewCell en le définissant comme
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
J'espère que cela t'aides. :)
Si vous souhaitez simplement supprimer la couleur de fond grise, procédez comme suit:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}
Cela fonctionnait parfaitement avec les appels groupés: implémentez une sous-classe personnalisée de UITableViewCell
Cela respectera les coins et autres ...
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
if(selected)
[self setBackgroundColor:[UIColor colorWithRed:(245/255.0) green:(255/255.0) blue:(255/255.0) alpha:1]];
else
[self setBackgroundColor:[UIColor whiteColor]];
}
Le style par défaut est gris et il détruit les couleurs de la cellule s'il a été fait par programme. Vous pouvez le faire pour éviter cela. (en Swift)cell.selectionStyle = .None
in Swift 3, converti à partir de la réponse illuminée.
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if(selected) {
self.selectionStyle = .none
self.backgroundColor = UIColor.green
} else {
self.backgroundColor = UIColor.blue
}
}
(cependant la vue ne change qu'une fois la sélection confirmée en relâchant votre doigt)
Consultez AdvancedTableViewCells
in exemple de code Apple .
Vous voudrez utiliser le modèle de cellule composite.
Dans Swift
let v = UIView()
v.backgroundColor = self.darkerColor(color)
cell?.selectedBackgroundView = v;
...
func darkerColor( color: UIColor) -> UIColor {
var h = CGFloat(0)
var s = CGFloat(0)
var b = CGFloat(0)
var a = CGFloat(0)
let hueObtained = color.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
if hueObtained {
return UIColor(hue: h, saturation: s, brightness: b * 0.75, alpha: a)
}
return color
}
Travaille pour moi
UIView *customColorView = [[UIView alloc] init];
customColorView.backgroundColor = [UIColor colorWithRed:180/255.0
green:138/255.0
blue:171/255.0
alpha:0.5];
cell.selectedBackgroundView = customColorView;
Créez un UITableViewCell personnalisé. À l'intérieur de votre classe personnalisée, remplacez la fonction "setSelected" et modifiez la couleur d'arrière-plan contentView. Vous pouvez également remplacer votre fonction "setHighlighted".
Dans Swift:
class myTableViewCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
// Add your color here
self.contentView.backgroundColor = UIColor.whiteColor()
}
override func setHighlighted(highlighted: Bool, animated: Bool) {
// Add your color here
self.contentView.backgroundColor = UIColor.whiteColor()
}
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
self.contentView.backgroundColor = .black
} else {
self.contentView.backgroundColor = .white
}
}
Voici un moyen rapide de le faire directement dans Interface Builder (dans un Storyboard). Faites glisser une simple UIView en haut de votre UITableView comme dans Connectez ensuite la prise selectedBackgroundView
de votre cellule à cette vue. Vous pouvez même connecter plusieurs prises de cellules à cette vue.
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor yellowColor];
}
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
Pour une solution qui fonctionne (correctement) avec UIAppearance
pour iOS 7 (et supérieur?) En sous-classant UITableViewCell
et en utilisant sa valeur par défaut selectedBackgroundView
pour définir la couleur, jetez un œil à ma réponse à une question similaire ici .
J'ai essayé chacune des réponses ci-dessus, mais aucune ne me convient le mieux,
alors j'ai examiné l'une des méthodes natives fournies, et cela fonctionne très bien.
tout d'abord, définissez cellSelectionStyle sur None, puis optez pour cette solution.
func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?
{
let cell = tableView.cellForRow(at: indexPath);
//cell which is getting deselected, make whatever changes that are required to make it back normal
cell.backgroundColor = kNormalColor;
return indexPath;
}
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
let cell = tableView.cellForRow(at: indexPath);
//cell which is getting selected, make whatever changes that are required to make it selected
cell.backgroundColor = kSelectedColor;
return indexPath;
}
l'avantage de ces méthodes sur les autres est:
Swift 3, 4, 5 sélectionnez la couleur d'arrière-plan des cellules
1) Modifiez uniquement la couleur en surbrillance lorsque l'utilisateur clique sur la cellule:
1.1) Classe de cellule intérieure:
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
let backgroundView = UIView()
backgroundView.backgroundColor = UIColor.init(white: 1.0, alpha: 0.1)
selectedBackgroundView = backgroundView
}
1.2) Viewcontroller que vous utilisez une cellule personnalisée
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
2) Si vous définissez la couleur des cellules sélectionnées:
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
if selected {
self.backgroundColor = .darkGray
} else {
self.backgroundColor = .white
}
}
var last_selected:IndexPath!
définir last_selected: IndexPath dans la classe
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! Cell
cell.contentView.backgroundColor = UIColor.lightGray
cell.txt.textColor = UIColor.red
if(last_selected != nil){
//deselect
let deselect_cell = tableView.cellForRow(at: last_selected) as! Cell
deselect_cell.contentView.backgroundColor = UIColor.white
deselect_cell.txt.textColor = UIColor.black
}
last_selected = indexPath
}