J'ai créé un personnalisé UITableViewCell
. La vue en tableau montre bien les données. Ce que je suis coincé est lorsque l'utilisateur touche une cellule de table, puis je veux afficher la couleur d'arrière-plan de la cellule autre que les valeurs par défaut [couleur bleue] pour mettre en surbrillance la sélection de cellule. J'utilise ce code mais rien ne se passe:
cell.selectedBackgroundView.backgroundColor=[UIColor blackColor];
Je pense que vous étiez sur la bonne voie, mais selon la définition de classe pour selectedBackgroundView
:
La valeur par défaut est nil pour les cellules des tables de style brut (UITableViewStylePlain) et non nil pour les tables de groupe de sections UITableViewStyleGrouped).
Par conséquent, si vous utilisez une table de style brut, vous devrez allouer-initier un nouveau UIView
ayant la couleur d'arrière-plan souhaitée, puis l'attribuer à selectedBackgroundView
.
Alternativement, vous pouvez utiliser:
cell.selectionStyle = UITableViewCellSelectionStyleGray;
si tout ce que vous vouliez était un fond gris lorsque la cellule est sélectionnée. J'espère que cela t'aides.
Pas besoin de cellules personnalisées. Si vous souhaitez uniquement modifier la couleur sélectionnée de la cellule, procédez comme suit:
Objective-C:
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
Swift:
let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.redColor()
cell.selectedBackgroundView = bgColorView
Swift 3:
let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.red
cell.selectedBackgroundView = bgColorView
Swift 4.x:
let bgColorView = UIView()
bgColorView.backgroundColor = .red
cell.selectedBackgroundView = bgColorView
Edit: mis à jour pour ARC
Édition: Ajoute Swift 3
Si vous avez une table groupée avec une seule cellule par section, ajoutez simplement cette ligne supplémentaire au code: bgColorView.layer.cornerRadius = 10;
UIView *bgColorView = [[UIView alloc] init];
[bgColorView setBackgroundColor:[UIColor redColor]];
bgColorView.layer.cornerRadius = 10;
[cell setSelectedBackgroundView:bgColorView];
[bgColorView release];
N'oubliez pas d'importer QuartzCore.
Swift 3: cela a fonctionné pour moi lorsque vous l'avez mis dans la méthode cellForRowAtIndexPath:
let view = UIView()
view.backgroundColor = UIColor.red
cell.selectedBackgroundView = view
Ce qui suit fonctionne pour moi dans iOS 8.
Je dois définir le style de sélection sur UITableViewCellSelectionStyleDefault
pour que la couleur d'arrière-plan personnalisée fonctionne. S'il s'agit d'un autre style, la couleur d'arrière-plan personnalisée sera ignorée. Il semble y avoir un changement de comportement car les réponses précédentes doivent définir le style sur none à la place.
Le code complet de la cellule comme suit:
- (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;
}
Créez une cellule personnalisée pour votre cellule de tableau et dans la cellule personnalisée class.m, mettez le code ci-dessous, cela fonctionnera correctement. Vous devez placer l’image couleur souhaitée dans selectionBackground
UIImage.
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"];
UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground];
self.selectedBackgroundView=iview;
}
extension UITableViewCell {
var selectionColor: UIColor {
set {
let view = UIView()
view.backgroundColor = newValue
self.selectedBackgroundView = view
}
get {
return self.selectedBackgroundView?.backgroundColor ?? UIColor.clear
}
}
}
cell.selectionColor = UIColor.FormaCar.blue
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIView *view = [[UIView alloc] init];
[view setBackgroundColor:[UIColor redColor]];
[cell setSelectedBackgroundView:view];
}
Nous devons définir la vue d'arrière-plan sélectionnée dans cette méthode.
Dans Swift 4, vous pouvez également définir la couleur d'arrière-plan de votre cellule de tableau globalement (à partir de ici ):
let backgroundColorView = UIView()
backgroundColorView.backgroundColor = UIColor.red
UITableViewCell.appearance().selectedBackgroundView = backgroundColorView
Si vous souhaitez ajouter une couleur personnalisée en surbrillance à votre cellule (et que celle-ci contient des boutons, des étiquettes, des images, etc.), j'ai suivi les étapes suivantes:
Par exemple, si vous voulez une couleur jaune sélectionnée:
1) Créez une vue qui correspond à toute la cellule avec une opacité de 20% (avec une couleur jaune), appelée par exemple backgroundselectedView.
2) Dans le contrôleur de cellule, écrivez ceci:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundselectedView.alpha=1;
[super touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundselectedView.alpha=0;
[super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundSelectedImage.alpha=0;
[super touchesCancelled:touches withEvent:event];
}
Si vous utilisez un TableViewCell personnalisé, vous pouvez également remplacer awakeFromNib
:
override func awakeFromNib() {
super.awakeFromNib()
// Set background color
let view = UIView()
view.backgroundColor = UIColor.redColor()
selectedBackgroundView = view
}
Un dernier conseil à la manière dont Christian affiche le fond des angles arrondis pour la table groupée.
Si j'utilise cornerRadius = 10
pour cellule, le fond de sélection arrondi de quatre coins est affiché. Ce n'est pas la même chose avec l'interface utilisateur par défaut de la vue tableau.
Donc, je pense à un moyen facile de le résoudre avec cornerRadius. Comme vous pouvez le constater à l'aide des codes ci-dessous, vérifiez l'emplacement de la cellule (haut, bas, milieu ou haut) et ajoutez une ou plusieurs sous-couches pour masquer le coin supérieur ou inférieur. Cela montre exactement le même aspect avec l’arrière-plan de sélection de la vue tableau par défaut.
J'ai testé ce code avec iPad splitterview
. Vous pouvez modifier la position du cadre de patchLayer selon vos besoins.
S'il vous plaît laissez-moi savoir s'il existe un moyen plus facile d'atteindre le même résultat.
if (tableView.style == UITableViewStyleGrouped)
{
if (indexPath.row == 0)
{
cellPosition = CellGroupPositionAtTop;
}
else
{
cellPosition = CellGroupPositionAtMiddle;
}
NSInteger numberOfRows = [tableView numberOfRowsInSection:indexPath.section];
if (indexPath.row == numberOfRows - 1)
{
if (cellPosition == CellGroupPositionAtTop)
{
cellPosition = CellGroupPositionAtTopAndBottom;
}
else
{
cellPosition = CellGroupPositionAtBottom;
}
}
if (cellPosition != CellGroupPositionAtMiddle)
{
bgColorView.layer.cornerRadius = 10;
CALayer *patchLayer;
if (cellPosition == CellGroupPositionAtTop)
{
patchLayer = [CALayer layer];
patchLayer.frame = CGRectMake(0, 10, 302, 35);
patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
[bgColorView.layer addSublayer:patchLayer];
}
else if (cellPosition == CellGroupPositionAtBottom)
{
patchLayer = [CALayer layer];
patchLayer.frame = CGRectMake(0, 0, 302, 35);
patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
[bgColorView.layer addSublayer:patchLayer];
}
}
}
Selon la couleur personnalisée pour une cellule sélectionnée dans UITableView
, excellente solution selon Maciej Swic's answer
Pour ajouter à cela, vous déclarez Swic réponse dans la configuration de cellule généralement sous:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Et pour un effet supplémentaire, vous pouvez utiliser des valeurs RVB pour une apparence de couleur personnalisée au lieu des couleurs système. Dans mon code, voici comment je l'ai réalisé:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
}
static NSString *CellIdentifier = @"YourCustomCellName";
MakanTableCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"YourCustomCellClassName" owner:self options:nil]objectAtIndex:0];
}
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor colorWithRed:255.0/256.0 green:239.0/256.0 blue:49.0/256.0 alpha:1];
bgColorView.layer.cornerRadius = 7;
bgColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView:bgColorView];
return cell;
}
Faites-moi savoir si cela fonctionne pour vous aussi. Vous pouvez jouer avec le numéro cornerRadius
pour les effets sur les coins de la cellule sélectionnée.
J'ai une approche légèrement différente de celle de tous les autres qui reflète la sélection au toucher plutôt qu'après avoir été sélectionnée. J'ai un UITableViewCell sous-classé. Tout ce que vous avez à faire est de définir la couleur d'arrière-plan dans les événements tactiles, ce qui simule la sélection au toucher, puis de définir la couleur d'arrière-plan dans la fonction setSelected. La définition de la couleur d'arrière-plan dans la fonction selSelected permet de désélectionner la cellule. Assurez-vous de transmettre l'événement tactile au super, sinon la cellule ne se comportera pas comme si elle était sélectionnée.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.backgroundColor = UIColor(white: 0.0, alpha: 0.1)
super.touchesBegan(touches, withEvent: event)
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
self.backgroundColor = UIColor.clearColor()
super.touchesCancelled(touches, withEvent: event)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
self.backgroundColor = selected ? UIColor(white: 0.0, alpha: 0.1) : UIColor.clearColor()
}
Je tiens à noter que l'éditeur XIB vous offre les options standard suivantes:
Section: bleu/gris/aucun
(La colonne de droite avec les options, 4ème onglet, premier groupe "Cellule de la vue du tableau", 4ème sous-groupe, le premier des 3 éléments se lit "Sélection")
Vous pouvez probablement atteindre ce que vous voulez faire en sélectionnant la bonne option standard.
Pour remplacer UITableViewCell
setSelected
fonctionne également.
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Set background color
let view = UIView()
view.backgroundColor = UIColor.redColor()
selectedBackgroundView = view
}
pour Swift 3.0:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = super.tableView(tableView, cellForRowAt: indexPath)
cell.contentView.backgroundColor = UIColor.red
}
Ajouter les lignes suivantes dans votre cellule de tablea
let bgColorView = UIView()
bgColorView.backgroundColor = .red
self.selectedBackgroundView = bgColorView
Enfin, il devrait être comme ci-dessous
override func setSelected(_ selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
let bgColorView = UIView()
bgColorView.backgroundColor = .red
self.selectedBackgroundView = bgColorView
}
Pour ajouter le fond pour toutes les cellules (en utilisant la réponse de Maciej):
for (int section = 0; section < [self.tableView numberOfSections]; section++) {
for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];
//stuff to do with each cell
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
}
}
pour ceux qui veulent juste se débarrasser de l’arrière-plan gris sélectionné par défaut, insérez cette ligne de code dans votre fonction cellForRowAtIndexPath:
yourCell.selectionStyle = .None
Swift 4.x
Pour modifier la couleur de fond de la sélection en n’importe quelle couleur, utilisez Swift Extension
Créez l'extension UITableView Cell comme ci-dessous
extension UITableViewCell{
func removeCellSelectionColour(){
let clearView = UIView()
clearView.backgroundColor = UIColor.clear
UITableViewCell.appearance().selectedBackgroundView = clearView
}
}
Ensuite, appelez removeCellSelectionColour () avec l'instance de cellule.
En cas de classe de cellule personnalisée. Juste remplacer:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
[self setBackgroundColor: CELL_SELECTED_BG_COLOR];
[self.contentView setBackgroundColor: CELL_SELECTED_BG_COLOR];
}else{
[self setBackgroundColor: [UIColor clearColor]];
[self.contentView setBackgroundColor: [UIColor clearColor]];
}
}
Voici les parties importantes du code nécessaires pour une table groupée. Lorsque l'une des cellules d'une section est sélectionnée, la première ligne change de couleur. Si vous ne définissez pas initialement le style de sélection de cellule sur no, il y a un double rechargement annulateur lorsque l'utilisateur clique sur row0 où la cellule devient bgColorView, puis estompe et recharge à nouveau bgColorView. Bonne chance et laissez-moi savoir s'il existe un moyen plus simple de le faire.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if ([indexPath row] == 0)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *bgColorView = [[UIView alloc] init];
bgColorView.layer.cornerRadius = 7;
bgColorView.layer.masksToBounds = YES;
[bgColorView setBackgroundColor:[UIColor colorWithRed:.85 green:0 blue:0 alpha:1]];
[cell setSelectedBackgroundView:bgColorView];
UIColor *backColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithWhite:1 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row0";
}
else if ([indexPath row] == 1)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row1";
}
else if ([indexPath row] == 2)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row2";
}
return cell;
}
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:[indexPath section]];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
[tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tvStat cellForRowAtIndexPath:indexPath];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}
#pragma mark Table view Gestures
-(IBAction)singleTapFrom:(UIGestureRecognizer *)tapRecog
{
CGPoint tapLoc = [tapRecog locationInView:tvStat];
NSIndexPath *tapPath = [tvStat indexPathForRowAtPoint:tapLoc];
NSIndexPath *seleRow = [tvStat indexPathForSelectedRow];
if([seleRow section] != [tapPath section])
[self tableView:tvStat didDeselectRowAtIndexPath:seleRow];
else if (seleRow == nil )
{}
else if([seleRow section] == [tapPath section] || [seleRow length] != 0)
return;
if(!tapPath)
[self.view endEditing:YES];
[self tableView:tvStat didSelectRowAtIndexPath:tapPath];
}
J'utilise l'approche ci-dessous et fonctionne bien pour moi,
class MyTableViewCell : UITableViewCell {
var defaultStateColor:UIColor?
var hitStateColor:UIColor?
override func awakeFromNib(){
super.awakeFromNib()
self.selectionStyle = .None
}
// if you are overriding init you should set selectionStyle = .None
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let hitColor = hitStateColor {
self.contentView.backgroundColor = hitColor
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let defaultColor = defaultStateColor {
self.contentView.backgroundColor = defaultColor
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
if let defaultColor = defaultStateColor {
self.contentView.backgroundColor = defaultColor
}
}
}
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];
Assurez-vous que vous avez utilisé la ligne ci-dessus pour utiliser l'effet de sélection
C'est facile quand le style de vue de table est simple, mais dans le style de groupe, c'est un petit problème, je le résout en:
CGFloat cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kGroupTableViewCellWidth+2, cellHeight)];
view.backgroundColor = kCommonHighlightedColor;
cell.selectedBackgroundView = view;
[view release];
UIRectCorner cornerFlag = 0;
CGSize radii = CGSizeMake(0, 0);
NSInteger theLastRow = --> (yourDataSourceArray.count - 1);
if (indexPath.row == 0) {
cornerFlag = UIRectCornerTopLeft | UIRectCornerTopRight;
radii = CGSizeMake(10, 10);
} else if (indexPath.row == theLastRow) {
cornerFlag = UIRectCornerBottomLeft | UIRectCornerBottomRight;
radii = CGSizeMake(10, 10);
}
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:cornerFlag cornerRadii:radii];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = maskPath.CGPath;
view.layer.mask = shapeLayer;
noté le kGroupTableViewCellWidth, je le définit comme 300, c'est la largeur de la largeur de la cellule de la table de groupe dans l'iPhone
override func setSelected(selected: Bool, animated: Bool) {
// Configure the view for the selected state
super.setSelected(selected, animated: animated)
let selView = UIView()
selView.backgroundColor = UIColor( red: 5/255, green: 159/255, blue:223/255, alpha: 1.0 )
self.selectedBackgroundView = selView
}
Essayez de suivre le code.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[cellIdArray objectAtIndex:indexPath.row] forIndexPath:indexPath];
// Configure the cell...
cell.backgroundView =
[[UIImageView alloc] init] ;
cell.selectedBackgroundView =[[UIImageView alloc] init];
UIImage *rowBackground;
UIImage *selectionBackground;
rowBackground = [UIImage imageNamed:@"cellBackgroundDarkGrey.png"];
selectionBackground = [UIImage imageNamed:@"selectedMenu.png"];
((UIImageView *)cell.backgroundView).image = rowBackground;
((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;
return cell;
}
// version rapide:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
cell.selectedBackgroundView = UIImageView()
cell.backgroundView=UIImageView()
let selectedBackground : UIImageView = cell.selectedBackgroundView as! UIImageView
selectedBackground.image = UIImage.init(named:"selected.png");
let backGround : UIImageView = cell.backgroundView as! UIImageView
backGround.image = UIImage.init(named:"defaultimage.png");
return cell
}
J'utilise iOS 9.3 et la définition de la couleur via le Storyboard ou la configuration de cell.selectionStyle
n'a pas fonctionné pour moi, mais le code ci-dessous a fonctionné:
UIView *customColorView = [[UIView alloc] init];
customColorView.backgroundColor = [UIColor colorWithRed:55 / 255.0
green:141 / 255.0
blue:211 / 255.0
alpha:1.0];
cell.selectedBackgroundView = customColorView;
return cell;
J'ai trouvé cette solution ici .