Benutzerdefinierter UITableViewCell-Auswahlstil?


82

Wenn ich auf meine klicke UITableViewCell, wird der Hintergrundteil (die Bereiche, die mein Hintergrundbild nicht abdeckt) blau, wenn ich auf die Zelle klicke. Außerdem werden alle UILabels in der Zelle weiß, wenn darauf geklickt wird, was ich möchte.

Was ich jedoch nicht möchte, ist der blaue Hintergrund, wenn ich darauf klicke. Wenn ich dies jedoch tue selectionstylenone, verliere ich die hervorgehobenen Farben für das UILabels in der Zelle.

Gibt es also eine Möglichkeit, den blauen Hintergrund beim Klicken auf die Zelle einfach zu entfernen, aber die hervorgehobenen Farben des UILabels beizubehalten?


Antworten:


174

Sie können dies wie folgt tun. Stellen Sie den Auswahlstil Ihrer Tabellenzelle auf ein UITableViewCellSelectionStyleNone. Dadurch wird die blaue Hintergrundhervorhebung entfernt. Damit die Hervorhebung der Textbeschriftung wie gewünscht funktioniert, erstellen Sie anstelle der Standardklasse UITableViewCell eine Unterklasse von UITableViewCellund überschreiben Sie die Standardimplementierung setHighlighted:animatedmit Ihrer eigenen Implementierung, die die Beschriftungsfarben je nach hervorgehobenem Status auf die gewünschten Werte festlegt .

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

11
Stellen Sie als Randnotiz sicher, dass Sie überschreiben setHighlighted:animated:, was den animatedParameter übernimmt . Das Überschreiben der Ein-Parameter- setHighlighted:Methode funktioniert nicht.
Imre Kelényi

14
Sollen wir anrufen [super setHighlighted:highlighted animated:animated];?
SoftDesigner

Vielen Dank! Klappt wunderbar! Und dies gibt mir die Kontrolle über das Hervorheben anderer benutzerdefinierter Ansichten in der Zelle, wenn ich möchte, da das Standard-Hervorheben seltsam ist.
Imike

2
Diese Methode hat jedoch ein Problem, wenn Sie setHighlightedund überschreiben setSelected. Zuerst wählen Sie eine Zelle aus, ok, die Textfarbe ändert sich in Weiß, dann scrollen Sie diese Zelle aus Ihrem visuellen Bildschirmteil heraus und scrollen dann zurück, siehe, die Textfarbe wird schwarz
Ronan

1
@jonkroll Ich habe das Konzept verstanden, aber meine Anforderung ist, dass bei der Auswahl einer Zelle die Farbe des Textlabels dieser Zelle als selectedColor bleiben soll. Im Moment ändert sich nur die Farbe des textLabel während der Auswahl, danach die Ausgewählter TextLabel bleibt in der Originalfarbe
Samarth Kejriwal

75

Wenn Sie vor iOS7 arbeiten, sollten Sie Ihren Zellenauswahlstil nicht festlegen

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Sonst lass es vorbei UITableViewCellSelectionStyleDefault

Dann:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Dieser Code funktioniert ordnungsgemäß


2
@ iBradApps ... hier erstellen Sie keine benutzerdefinierte Klasse ... von UI Tableview Cell
Alfa

2
Dies positiv bewerten - es ist die einzige Lösung, die für mich funktioniert hat, um die Nicht-Textfarbe einer ausgewählten Zelle in iOS 7 zu ändern.
Vern Jensen

1
Auswahlstil sollte Auswahlstil sein
braden

12
Diese Lösung funktionierte unter iOS7, jedoch erst, nachdem ich selectionStyle auf UITableViewCellStyleDefault gesetzt hatte.
Jay Q.

1
Diese Methode ist die einzige Methode, die absolut identisch mit dem "Out-of-Box" -Zellenauswahlverhalten von Apple ist. Es sollte Antwort akzeptiert werden.
mkll

16

Sie können die folgenden Delegierungsmethoden verwenden, nachdem Sie den Auswahlstil auf none festgelegt haben:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Implementieren Sie Ihren Code hier wie folgt

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

1
Tolle und saubere Lösung! Sie müssen nur den Aufruf willDeselectRowAtIndexPath implementieren und es funktioniert wie Magie!
Matej Balantič

1
Ein möglicher Nachteil ist, dass diese Methode erst aufgerufen wird, wenn Ihr Finger die ausgewählte Zelle verlässt. Einige andere Ansätze werden wirksam, sobald Sie die Zelle berühren.
Arlomedia

13

Verwenden Sie in cellForRowAtIndexPath diesen Code:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Hoffe das wird für dich funktionieren.

Viel Spaß beim Codieren :)


Diese Antwort muss oben sein. :)
Chintan Patel

2
Das wird nicht funktionieren. Wenn Sie [cell.textLabel setHighlightedTextColor: [UIColor blueColor]] erstellen möchten; ZellenauswahlStyle sollte nicht NONE sein.
Femina

13

Um diese Arbeit zu erhalten, müssen Sie den Auswahlstil auf einstellen UITableViewCellSelectionStyleNoneund dann die Methode überschreiben setSelected:animated:, um das gewünschte Ergebnis zu erhalten. Es macht dasselbe wie der automatische Auswahlmechanismus von iOS, wenn Sie die blaue (oder graue) Auswahl sehen.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Sie können dies auch auf andere Weise anpassen, z. B. indem Sie den UITableViewCell-Hintergrund usw. ändern.


6

Überschreiben der folgenden Funktionen in Ihrer Unterklasse von UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

Danke dir; Dies war die einzige, bei der beim Ändern der Hintergrundfarbe nicht die gesamte Zeile vom linken Bildschirmrand nach rechts ausgewählt wurde.
Jose Ramirez

Ich habe nur setSelected überschrieben, weshalb die Zelle aus irgendeinem Grund manchmal immer noch blinkte.
Zonily Jame

3

Um dem Standardverhalten des Auswahlstils zu entsprechen, sollten Sie sowohl setHighlighted:animated:als als auch überschreiben setSelected:animated:. Möglicherweise möchten Sie diesen Code in eine gemeinsam genutzte Methode verschieben, um doppelten Code zu vermeiden.

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}

1

Überschreiben Sie in Ihrer benutzerdefinierten Zelle die Standardimplementierung von awakeFromNib & setSelected:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

Achten Sie außerdem darauf , dass die Auswahl Stil ist nicht gesetzt None .


0

Der einzige Weg, wie ich es zum Laufen bringen konnte, war:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}

0

Sie können auch contentView.alpha verwenden. Hier ist das Beispiel.

Legen Sie zunächst den Auswahlstil für Ihre Zelle fest:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Als nächstes überschreiben Sie in einer benutzerdefinierten Zellenklasse diese Methode mit einem Animationsbeispiel:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.