Wie ändere ich die blaue Markierungsfarbe einer UITableViewCell?

131

Ich frage mich, wie ich die blaue Markierungs- / Auswahlfarbe von a ändern UITableViewCellkann. Irgendwelche Ideen?

Thomas Joos
quelle

Antworten:

213

Sie können die Hervorhebungsfarbe auf verschiedene Arten ändern.

  1. Ändern Sie die selectionStyle-Eigenschaft Ihrer Zelle. Wenn Sie es ändern UITableViewCellSelectionStyleGray, wird es grau.

  2. Ändern Sie die selectedBackgroundViewEigenschaft. Tatsächlich erzeugt der blaue Farbverlauf eine Ansicht. Sie können eine Ansicht erstellen und zeichnen, was immer Sie möchten, und die Ansicht als Hintergrund für Ihre Tabellenansichtszellen verwenden.

zonble
quelle
8
cool, fand eine gute Erklärung und ein Beispiel hier: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
Ich habe festgestellt, dass Sie in IB die UITableViewCell "Auswahl" nicht auf "Keine" setzen können - weil selectedBackgroundViewsie dann einfach nie angezeigt wird. Erst nachdem "Auswahl" auf Standard gesetzt wurde, wird das selectedBackgroundViewangezeigt. Getestet auf iOS 6 und 7.
Jonny
12
Danke für den tollen Hinweis! Dies macht es jetzt so einfach: Sie erstellen eine neue Ansicht (Sie müssen nicht einmal den Rahmen angeben: cell.selectedBackgroundView = [UIView new];und Sie legen die gewünschte Farbe fest:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P
Schauen Sie am Ende dieser Seite, es gibt neuere Ansätze
Climbatize
145

Zonble hat bereits eine hervorragende Antwort gegeben. Ich dachte, es könnte nützlich sein, ein Kurzcode-Snippet zum Hinzufügen eines UIViewzu der Tabellenansichtszelle hinzuzufügen , das als ausgewählte Hintergrundansicht angezeigt wird.

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;
  • Zelle ist meine UITableViewCell
  • Ich habe ein UIView erstellt und seine Hintergrundfarbe mit RGB-Farben (hellgrau) festgelegt.
  • Ich habe dann die Zelle selectedBackgroundViewso eingestellt, UIViewdass sie mit der von mir gewählten Hintergrundfarbe erstellt wurde

Das hat bei mir gut funktioniert. Danke für den Tipp Zonble.

T Davey
quelle
2
Dies funktioniert nicht gut, wenn Tabellenansichten mit Abschnitten verwendet werden. Bei Auswahl dieser Option verliert die Zelle die Ränder und wird bei der ersten oder letzten Zelle nicht gerundet.
Kirk Woll
7
@ Kirk, du meinst gruppiert :)
Tieme
@Tieme, nein, ich meine Abschnitte : "Eine Tabellenansicht besteht aus null oder mehr Abschnitten mit jeweils eigenen Zeilen."
Kirk Woll
Sie müssen es im 'cellForRowAtIndexPath' platzieren. Funktioniert gut für mich, mit einem Abschnitt. Nicht mit mehreren Abschnitten ausprobiert.
Vincent
Ein wenig spät zum Spiel, aber ich kann bestätigen, dass es in einer Tabellenansicht mit mehreren Abschnitten (nicht gruppiert)
funktioniert
30

UITableViewCell hat drei Standardauswahlstile: -

  1. Blau
  2. Grau
  3. Keiner

Die Implementierung ist wie folgt: -

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Arshad Parwez
quelle
7
Anstelle dieser drei Standardstile können wir den ausgewählten Stil auch über die Eigenschaft selectedBackgroundView anpassen.
Sunil Targe
Arbeitete für mich ... Vielen Dank.
Mujeeb Farooqi
19

Verwenden Sie dies in Swift in cellForRowAtIndexPath

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

Wenn Sie möchten, dass Ihre Auswahlfarbe in allen Farben gleich ist UITableViewCell, verwenden Sie diese in AppDelegate.

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

Wenn Sie es App-weit ändern möchten, können Sie die Logik Ihrem App-Delegaten hinzufügen

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
quelle
Perfekt. Haben Sie eine Idee, wie Sie die Textfarbe dieser Standardzelle bei Auswahl global festlegen können?
BananaAcid
1
Dies funktioniert, aber dann wird die Auswahl direkt gelöscht, wenn der neue Ansichts-Controller gedrückt wird.
Bobmoff
Gute Möglichkeit, globale Änderungen an UITableViewCell vorzunehmen
Shashi3456643
12

Der Vollständigkeit halber: Wenn Sie eine eigene Unterklasse von erstellt haben UITableViewCell, können Sie die - (void)setSelected:(BOOL)selected animated:(BOOL)animatedMethode implementieren und die Hintergrundfarbe einer Ansicht festlegen, die Sie in der Inhaltsansicht hinzugefügt haben. (wenn dies der Fall ist) oder der contentView selbst (wenn sie nicht von einer Ihrer eigenen Ansichten abgedeckt wird.

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

(nicht verwendet? um die geringe Breite der Quellcode-DIVs anzupassen :)

Dieser Ansatz hat zwei Vorteile gegenüber der Verwendung von selectedBackgroundView: Er benötigt weniger Speicher und etwas weniger CPU, was Sie nicht einmal bemerken würden, wenn Sie nicht Hunderte von Zellen anzeigen.

Martijn Scheffer
quelle
Dies funktioniert erst, nachdem eine neue Ansicht selectedBackgroundView dem zu Beginn der Methode addself. selectedBackgroundView = [UIView new];
enadun
@enadun Diese Methode funktioniert für mich unter iOS 12, ohne dass die selectedBackgroundViewEigenschaft festgelegt wurde.
Nate
11

Ich muss den Auswahlstil auf einstellen, damit die UITableViewCellSelectionStyleDefaultbenutzerdefinierte Hintergrundfarbe funktioniert. Bei anderen Stilen wird die benutzerdefinierte Hintergrundfarbe ignoriert. Getestet auf iOS 8.

Der vollständige Code für die Zelle lautet wie folgt:

- (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
quelle
6

Basierend auf der Antwort des @ Benutzers können Sie diese Erweiterung einfach an einer beliebigen Stelle in Ihrem App-Code hinzufügen und Ihre Auswahlfarbe direkt im Storyboard-Editor für jede Zelle Ihrer App festlegen:

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

UITableViewCell-Auswahlfarbe im Storyboard

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

Setzen Sie in Ihrem Storyboard die Klasse Ihrer UITableViewCell auf UIDesignableTableViewCell. Im Attributinspektor können Sie die ausgewählte Farbe Ihrer Zelle in eine beliebige Farbe ändern.

Sie können dies für alle Ihre Zellen verwenden. So sieht Ihr Attributinspektor aus.

So sieht Ihr Attributinspektor aus

Benutzer
quelle
Sehr kreativ! großartig!
Kaushil Ruparelia
Sie können es noch einfacher machen, schauen Sie sich meine Antwort an;) stackoverflow.com/a/51764804/537694
Climbatize
Ich verwende eine benutzerdefinierte Zelle, um Beschriftungen festzulegen. Das funktioniert also gut, danke! Änderung für Swift 5: Es ist jetzt UIColor.clearnicht UIColor.clearColor(). Ich bin mir nicht sicher, ob dies auch eine Änderung in Swift ist, aber es funktioniert auch ohne @IBDesignable.
Neph
5

Swift 3.0 / 4.0

Wenn Sie eine eigene benutzerdefinierte Zelle erstellt haben, können Sie die Auswahlfarbe awakeFromNib()für alle Zellen ändern :

 override func awakeFromNib() {
    super.awakeFromNib()

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

    self.selectedBackgroundView = colorView


}
Sam Bing
quelle
0

1- Fügen Sie der Inhaltsansicht Ihrer Zelle eine Ansicht hinzu.
2- Klicken Sie mit der rechten Maustaste auf Ihre Zelle.
3- Machen Sie die hinzugefügte Ansicht als "selectedBackgroundView" Geben Sie hier die Bildbeschreibung ein

Badr
quelle