wake-up-neo.com

Ändern der Hintergrundfarbe der ausgewählten Zelle?

Weiß jemand, wie man die Hintergrundfarbe einer Zelle mit UITableViewCell für jede ausgewählte Zelle ändert? Ich habe diese UITableViewCell im Code für TableView erstellt.

48
sg.

Das Ändern der Eigenschaft selectedBackgroundView ist korrekt und der einfachste Weg. Ich benutze den folgenden Code, um die Auswahlfarbe zu ändern:

// 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];
92
Chilly Zhong

Ich habe es endlich geschafft, dies in einer Tabellenansicht mit dem Stil Gruppiert zum Laufen zu bringen.

Setzen Sie zuerst die Eigenschaft selectionStyle aller Zellen auf UITableViewCellSelectionStyleNone.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Implementieren Sie dann Folgendes in Ihren Tabellenansichtsdelegaten:

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];
    }
}
37
loomer
// 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];
    }
}
19
PK86

Swift 4, XCODE 9, IOS 11

Nach einigen Tests wird mit dieser Option [~ # ~] die Hintergrundfarbe entfernt, wenn die Auswahl aufgehoben wird, oder wenn die Zelle ein zweites Mal bei der Auswahl der Tabellenansicht berührt wird ist auf "Mehrfachauswahl" eingestellt. Funktioniert auch, wenn der Tabellenansichtsstil auf "Gruppiert" gesetzt ist.

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.contentView.backgroundColor = UIColor.darkGray
        }
    }
}

Hinweis: Damit dies funktioniert, wie Sie unten sehen, kann die Selection-Eigenschaft Ihrer Zelle auf einen beliebigen Wert gesetzt werden, ABER auf None.

Wie es mit verschiedenen Optionen aussieht

Stil: Normal , Auswahl: Einzelauswahl

Single Selection

Stil: Einfach , Auswahl: Mehrfachauswahl

Multiple Selection

Stil: Gruppiert , Auswahl: Mehrfachauswahl

Grouped Multiple Selection

Bonus - Animation

Probieren Sie eine Animation aus, um einen gleichmäßigeren Farbübergang zu erzielen:

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
            })
        }
    }
}

Animated color transition

Bonus - Text- und Bildwechsel

Möglicherweise stellen Sie fest, dass sich das Symbol und die Textfarbe auch ändern, wenn die Zelle ausgewählt wird. Dies geschieht automatisch, wenn Sie die Eigenschaften UIImage und UILabel Highlighted festlegen

UIImage

  1. Liefern Sie zwei farbige Bilder:

Two colored images

  1. Legen Sie die Eigenschaft Hervorgehobenes Bild fest:

Highlighted property

UILabel

Geben Sie einfach eine Farbe für die Eigenschaft "Hervorgehoben" ein:

Highlighted Color

12
Mark Moeykens
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
     cell.contentView.backgroundColor = [UIColor yellowColor];

}
11
Salim

Ich habe UIView erstellt und die Eigenschaft der Zelle selectedBackgroundView festgelegt:

UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
10
Yerkezhan

Wenn es sich um ausgewählte Zellen handelt, lautet die Eigenschaft -selectedBackgroundView. Dies wird angezeigt, wenn der Benutzer Ihre Zelle auswählt.

7
Steven Canfield

Für iOS7 + und wenn Sie Interface Builder verwenden, unterteilen Sie Ihre Zelle und implementieren:

Ziel-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())
}
6
Peter Lapisu

Ich habe eine hochgradig angepasste UITableViewCell. Also habe ich meine eigene Zellauswahl implementiert.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ich habe eine Methode in der Klasse meiner Zelle erstellt:

- (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);
    }
}

In meiner UITableViewController-Klasse in ViewWillAppear hat Folgendes hinzugefügt:

NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];

In didSelectRow hat Folgendes hinzugefügt:

SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
6
wzbozon

Ich hatte Glück mit:

- (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];
    }
}
6
sehugg

Ich konnte dieses Problem lösen, indem ich eine Unterklasse von UITableViewCell erstellte und die Methode setSelected: animated: implementierte

- (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]];
    }
}

Der Trick war das Setzen der

cell.selectionStyle = UITableViewCellSelectionStyleDefault;

im implementierenden View-Controller und dann in der tableViewCell als

[self setSelectionStyle:UITableViewCellSelectionStyleNone];

Hoffe das hilft. :)

5
illuminate

Wenn Sie nur die graue Hintergrundfarbe entfernen möchten, gehen Sie folgendermaßen vor:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}     
5
Coolsinus

Dies funktionierte perfekt bei gruppierten Aufrufen: Implementieren Sie eine benutzerdefinierte Unterklasse von UITableViewCell

Dies wird Ecken und solche respektieren ...

- (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]];

}
5
theprojectabot

Der Standardstil ist Grau und zerstört die Farben der Zelle, wenn dies programmgesteuert durchgeführt wurde. Sie können dies tun, um dies zu vermeiden. (in Swift)
cell.selectionStyle = .None

4
726a

in Swift 3, umgerechnet von illuminates answer.

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
    }
}

(Die Ansicht ändert sich jedoch erst, wenn die Auswahl durch Loslassen des Fingers bestätigt wird.)

3
Peter Johnson

Check out AdvancedTableViewCells in Apple-Beispielcode .

Sie möchten das zusammengesetzte Zellenmuster verwenden.

3
johndpope

In 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
}
3

Funktioniert bei mir

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;
2
Mrsantateam

Erstellen Sie eine benutzerdefinierte UITableViewCell. In Ihrer benutzerdefinierten Klasse überschreiben Sie die Funktion "setSelected" und ändern Sie die Hintergrundfarbe contentView. Sie können auch die "setHighlighted" -Funktion außer Kraft setzen.

In 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()
    }
}
2
Eduardo Irias
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.contentView.backgroundColor = .black
    } else {
        self.contentView.backgroundColor = .white
    }
}
1
Daniel Simons

Hier ist eine schnelle Möglichkeit, dies direkt in Interface Builder (innerhalb eines Storyboards) zu tun. Ziehen Sie eine einfache UIView wie in oben auf Ihre UITableView UIView Verbinden Sie als nächstes den selectedBackgroundView Ausgang Ihrer Zelle mit dieser Ansicht. Sie können sogar die Ausgänge mehrerer Zellen mit dieser einen Ansicht verbinden. Cell's outlet

1
Sebastian
- (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;
}
1
tuoxie007

Für eine Lösung, die (ordnungsgemäß) mit UIAppearance für iOS 7 (und höher?) Funktioniert, indem UITableViewCell und Verwenden Sie die Standardeinstellung selectedBackgroundView, um die Farbe festzulegen. Sehen Sie sich meine Antwort auf eine ähnliche Frage an. hier .

1
anneblue

Ich habe jede der obigen Antworten ausprobiert, aber keine passt am besten zu mir.

dann habe ich mir eine der nativen Methoden angesehen, und sie funktionieren einwandfrei.

stellen Sie cellSelectionStyle zunächst auf None und wählen Sie dann diese Lösung.

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;
}

vorteil dieser Methoden gegenüber allen anderen ist:

  1. Es funktioniert für die Auswahl mehrerer Zellen
  2. Sie können jedes beliebige Element ändern, nicht nur die Hintergrundfarbe einer bestimmten Zelle, wenn sie ausgewählt oder abgewählt wird.
0
Mehul Thakkar

Schnell 3, 4, 5 Zellenhintergrundfarbe auswählen

1) Ändere nur die hervorgehobene Farbe, wenn der Benutzer auf die Zelle klickt:

1.1) Innerhalb der Zellklasse:

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, den Sie als benutzerdefinierte Zelle verwenden

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

2) Wenn Sie die Farbe für ausgewählte Zellen festlegen möchten:

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
    }
}
0
Doca
var last_selected:IndexPath!

define last_selected: IndexPath innerhalb der Klasse

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
}
0
Talha Ahmed