Ich implementiere eine Farbauswahl-Tabellenansicht, in der der Benutzer beispielsweise zwischen 10 Farben auswählen kann (abhängig vom Produkt). Der Benutzer kann auch andere Optionen auswählen (z. B. Festplattenkapazität, ...).
Alle Farboptionen befinden sich in einem eigenen Tabellenansichtsbereich.
Ich möchte links neben dem textLabel ein kleines Quadrat mit der tatsächlichen Farbe anzeigen.
Im Moment füge ich ein einfaches quadratisches UIView hinzu und gebe ihm die richtige Hintergrundfarbe wie folgt:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Dies wird problemlos angezeigt.
Mein einziges Problem ist, dass meine benutzerdefinierte UIView (colorThumb) ausgeblendet wird, wenn ich während der Auswahlanimation "Ausblenden" eine "Farb" -Zeile auswähle. Es wird unmittelbar nach dem Ende der Auswahl- / Abwahlanimation wieder sichtbar, dies führt jedoch zu einem hässlichen Artefakt.
Was soll ich tun, um dies zu korrigieren? Füge ich die Unteransicht nicht an der richtigen Stelle ein?
(Der didSelectRowAtIndexPath enthält nichts Besonderes. Ich ändere einfach das Zubehör der Zelle in ein Kontrollkästchen oder nichts und deaktiviere den aktuellen indexPath.)
quelle
Antworten:
UITableViewCell
ändert sich die Hintergrundfarbe aller Teilansichten , wenn die Zelle ausgewählt oder markiert ist, Sie dieses Problem der Tableview Zelle lösen können durch zwingendesetSelected:animated
undsetHighlighted:animated
und Blick Hintergrundfarbe zurückzusetzen.In Ziel C:
In Swift 3.1:
quelle
if (highlighted)
undif (selected)
Bedingungen? Ich denke, es wird funktionieren, wenn wir diese Bedingungen nicht haben.Dies liegt daran, dass die Tabellenansichtszelle automatisch die Hintergrundfarbe aller Ansichten in der Inhaltsansicht für den hervorgehobenen Status ändert. Sie können eine Unterklasse
UIView
in Betracht ziehen, um Ihre Farbe zu zeichnen oder einUIImageView
benutzerdefiniertes gestrecktes Bild mit 1 x 1 Pixel zu verwenden.quelle
setHighlighted:animated:
undsetSelected:animated:
Ich habe eine ziemlich elegante Lösung gefunden, anstatt mit den Auswahl- / Hervorhebungsmethoden von tableViewCell herumzuspielen. Sie können eine Unterklasse von UIView erstellen, bei der die Hintergrundfarbe nicht auf klare Farbe gesetzt wird.
Swift 3/4:
Swift 2:
Obj-C-Version:
quelle
Eine andere Möglichkeit, das Problem zu lösen, besteht darin, die Ansicht mit einem Kerngrafikverlauf zu füllen, z.
quelle
Für Swift 2.2 funktioniert dies
und Grund wird von @ Andriy erklärt
quelle
Inspiriert von Yatheesha BL ‚s Antwort ich eine UITableViewCell Kategorie / Erweiterung erstellt , die Sie auf und neben dieser Transparenz‚Feature‘drehen kann.
Schnell
Ziel c
KeepBackgroundCell ist CocoaPods-kompatibel. Sie finden es auf GitHub
quelle
Sie können
cell.selectionStyle = UITableViewCellSelectionStyleNone;
dann die Hintergrundfarbe auf einstellen- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
quelle
Inspiriert von der Antwort von Yatheesha BL .
Wenn Sie super.setSelected aufrufen (ausgewählt, animiert: animiert), werden alle von Ihnen festgelegten Hintergrundfarben gelöscht . Wir werden also keine Super-Methode aufrufen .
In Swift:
quelle
Im Mai sind dies die Septs, um zu vermeiden, dass die graue Farbe für alle Elemente in der Zelle angezeigt wird (falls Sie eine benutzerdefinierte Tabellenansichtszelle verwenden):
Setzen Sie den Auswahlstil auf .none 👉
selectionStyle = .none
Überschreiben Sie diese Methode.
Rufen Sie den Super an, um die Vorteile des Super-Setups zu nutzen.
Machen Sie die gewünschte Hervorhebungslogik.
quelle
UITableViewCell ändert aus irgendeinem Grund die Hintergrundfarbe aller Unteransichten bei der Auswahl.
Dies könnte helfen:
DVColorLockView
Verwenden Sie so etwas, um zu verhindern, dass UITableView Ihre Ansichtsfarbe während der Auswahl ändert.
quelle
Zeichnen Sie die Ansicht, anstatt die Hintergrundfarbe festzulegen
quelle
EINFACHSTE Lösung ohne Fehler mit Animation (wie in der am besten bewerteten Antwort) und ohne Unterklassen und Zeichnen - stellen Sie die Rahmenfarbe der Ebene anstelle von backgroundColor ein und legen Sie eine sehr große Rahmenbreite fest.
quelle
Versuchen Sie folgenden Code:
quelle
Vergessen Sie nicht,
setSelected
so gut wie zu überschreibensetHighlighted
quelle
Dies ähnelt der Antwort von Pavel Gurov, ist jedoch flexibler, da jede Farbe dauerhaft sein kann.
quelle
Ich wollte das Standardauswahlverhalten beibehalten, mit Ausnahme einer Zellenunteransicht, bei der ich die automatische Änderung der Hintergrundfarbe ignorieren wollte. Aber ich musste auch in der Lage sein, die Hintergrundfarbe zu anderen Zeiten zu ändern.
Die Lösung, die ich gefunden habe, bestand darin, eine Unterklasse zu
UIView
erstellen, bei der das normale Einstellen der Hintergrundfarbe ignoriert wird, und eine separate Funktion hinzuzufügen, um den Schutz zu umgehen.Swift 4
quelle
Hier ist meine Lösung: Verwenden Sie contentView, um selectionColor anzuzeigen. Es funktioniert perfekt
quelle
Fügen Sie diesen Code in Ihre Unterklasse von ein
UITableViewCell
Swift 3-Syntax
quelle
Hinzufügen einer weiteren Lösung, wenn Sie Storyboards verwenden. Erstellen Sie eine Unterklasse, in der
UIView
das Festlegen nach dem erstmaligen Festlegen nicht möglichbackgroundColor
ist.quelle
Wenn die oben erwähnte Hintergrundlösung Ihr Problem nicht
datasource
behebt , liegt Ihr Problem möglicherweise in Ihrer für tableView.Für mich habe ich eine Instanz eines DataSource-Objekts (aufgerufen
BoxDataSource
) erstellt, um die Methoden delegate und dataSource tableView wie folgt zu behandeln:Dies führte dazu, dass die Zuordnung der dataSource aufgehoben wurde, wenn auf die Zelle getippt wurde, und somit der gesamte Inhalt verschwand. Der Grund dafür ist, dass ARC die Natur freigibt / Müll sammelt.
Um dies zu beheben, musste ich in die benutzerdefinierte Zelle gehen und eine Datenquellenvariable hinzufügen:
Dann müssen Sie die dataSource auf die dataSource der Zelle setzen, die
var
Sie gerade in cellForRow erstellt haben, damit die Zuordnung zu ARC nicht aufgehoben wird.Hoffentlich hilft das.
quelle