UITableView backgroundColor auf dem iPad immer weiß

75

Ich arbeite an einem Projekt. Ich habe viele UITableViews, die als klare Farbe eingestellt sind. Die Hintergrundfarbe ihrer Ansichten ist auf meine benutzerdefinierte Farbe eingestellt und auf dem iPhone ist alles in Ordnung .

Das Problem tritt auf dem iPad auf ! Ich habe fast alles versucht, aber meine UITableViewhat eine weiße Farbe.

Ich habe die anderen Themen überprüft, wie: UITableView backgroundColor auf dem iPad immer grau , aber nichts hat funktioniert. Außerdem ist mein Problem nicht grau, es ist weiß wie Schnee!

Was könnte der Grund dafür sein?

Göktuğ Aral
quelle
Verwenden Sie Xcode 6 mit Größenklassen? Sie können je nach verwendeter Größenklasse unterschiedliche Hintergrundfarben festlegen.
Brandonscript
@remus Nein, ich arbeite an Xcode 6, aber ich habe Größenklassen deaktiviert.
Göktuğ Aral
3
Legen Sie einen Haltepunkt fest, wenn Sie Ihre Zellen erstellen, und gehen Sie zu Debug -> View Debugging -> Capture View Hierarchy. Auf diese Weise können Sie jede Unteransicht Ihres Ansichtsstapels untersuchen, um genau zu sehen, welche Ansicht das Problem verursacht. Beachten Sie, ich denke, dass dies nur im Simulator funktioniert
Chris
Stellen Sie die Contectview und Zelle auf klare Farbe
Vineesh TP
@ Chris Ich habe vor einer Woche ein echtes Gerät ausprobiert :)
zcui93

Antworten:

125

Gute Nachricht: Laut Versionshinweisen für iOS 10:

Bei der Ausführung auf dem iPad wird jetzt die für eine UITableViewCell in einem Storyboard festgelegte Hintergrundfarbe berücksichtigt.

Für Versionen <10:

Ich habe dies in iOS 8 (8.3) gesehen. Obwohl meine Zellen in IB "klare Farbe" und ihre Inhaltsansichten "klare Farbe" hatten, wurden sie als weiß dargestellt. Eine unvollständige, aber vernünftige Lösung, da immer noch Werte von IB übernommen werden:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell.backgroundColor = cell.contentView.backgroundColor;
    return cell;
}

Es scheint, dass meine wiederverwendbaren Zellen in der Warteschlange ihren Hintergrund auf dem iPad weiß werden lassen. Ich konnte dies mithilfe des Debuggers für die Ansichtshierarchie feststellen.

Nachdem ich dies getan hatte, konnte ich die Hintergrundfarbe der Tabelle verwenden und musste keine Hintergrundansicht festlegen, obwohl dies auch funktioniert.

Ben Flynn
quelle
h / t an @SterlingChristensen, aus dessen Antwort dies aufbaut.
Ben Flynn
Seltsamerweise funktioniert das bei mir. Abgelegt ein Radar: openradar.appspot.com/radar?id=5187188266369024
Geoffrey Wiseman
Dies funktioniert jedoch. Es sollte beachtet werden, dass cell.contentView.backgroundColor möglicherweise nil zurückgibt, auch wenn IB einen Wert enthält. Daher funktioniert es möglicherweise nicht, wenn die Hintergrundfarben von UITableView von seinen Zellen abweichen.
Crashalot
Ich weiß nicht, wie Apple-Entwickler denken!
Hasan
Danke, funktioniert super für mich. Ich bin mein Fall, ich brauchte das Gegenteil cell.contentView.backgroundColor = cell.backgroundColor. Nachdem ich gedruckt cell.contentView.backgroundColorund bemerkt hatte, dass es nilvorher war, entfernte ich Ihren Vorschlag und änderte die Farbe der Inhaltsansicht im Storyboard, was auch funktionierte :)
aross
39

Sie können dies beheben, indem Sie in Ihrer appDelegate-Datei eine API-Einstellung für das Erscheinungsbild vornehmen:

Schnell:

UITableViewCell.appearance().backgroundColor = UIColor.clearColor()
Kiko Lobo
quelle
1
Diese Lösung hat mir das Leben gerettet!. Danke
Naffie
Lief wie am Schnürchen! In Ziel C:[UITableViewCell appearance].backgroundColor = [UIColor clearColor];
Solsma Dev
die einzige Lösung, die für mich funktioniert hat! Vielen Dank!!
Daisura99
Schöne, einfache Lösung!
Fünfholz
19

Anstatt die Hintergrundfarbe festzulegen, versuchen Sie stattdessen, eine Hintergrundansicht zu verwenden:

- (void)viewDidLoad {
    self.tableView.backgroundView = [UIView new];
    self.tableView.backgroundView.backgroundColor = [UIColor clearColor];
}

Ich hatte Probleme, bei denen die Verwendung von backgroundColor nicht immer einen Effekt erzeugt, sondern das Festlegen einer Hintergrundansicht einwandfrei funktioniert.

John Stephen
quelle
Ja, es hat funktioniert, danke. Aber es ist wirklich seltsam! ClearColor von TableView funktioniert auf dem iPhone, aber warum funktioniert es nicht auf dem iPad? Was könnte der Unterschied sein?
Göktuğ Aral
Das Pad muss einige UI-Modelle unterstützen, die das Telefon nicht unterstützt, wie z. B. Split-View-Controller und Popover. Vielleicht hat das etwas damit zu tun. Ich frage mich, ob es auf dem iPhone 6+ passiert, da es viele der gleichen UI-Funktionen unterstützen muss.
John Stephen
Es passiert nicht am 6+
Estel
Bleibt es weiß, wenn Sie genügend Tabellenzellen haben, um den Bildschirm auszufüllen, oder nur bei kurzen Tabellen? Scheint irgendwie mit der Anzahl der Zellen in einer Tabelle zu tun zu haben.
Crashalot
12

Aufbauend auf Ben Flynns Antwort ... Die Hintergrundfarbe von cell.contentView entspricht nicht unbedingt der Hintergrundfarbe von cell.contentView. In diesem Fall stellte ich fest, dass dies bei der Lösung des Problems mit dem weißen Hintergrund des iPad in mehreren Situationen hilfreich war:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ...
        cell.backgroundColor = cell.backgroundColor;
        return cell;
    }

Während die Aussage lächerlich und verrückt aussieht ... löst sie das Problem.

Ray W.
quelle
Hallo, ich versuche, das für Monotouch zum Laufen zu bringen. Ich arbeite mit Xamarin.iOS und verwende die ac # -Implementierung. Wie kann ich Ihre Lösung implementieren?
Naffie
Dieser Trick hat dieses Problem auf dem iPad für mich nicht behoben, sorry. cell.backgroundColor = [UIColor clearColor]; tat es aber.
Malhal
10

Swift 5

Ich habe eine Tabellenansicht mit vielen verschiedenen Zellen, jede hat eine andere Farbe.

Die Antwort von @Ben Flynn cell.backgroundColor = self.contentView.backgroundColorkann das nicht erreichen. Der Grund ist self.contentView.backgroundColorNull, also haben Sie nur das klargestellt cell.backgroundColor = nil.

Grundsätzlich ist es der Fehler von Xcode (ich denke, ja, es ist scheiße!), Hat cell.backgroundColorimmer noch Farbe, kann aber nicht angezeigt werden.

Nach einer Weile des Debuggens, basierend auf der Antwort von @Ray W, ist hier meine Lösung.

class YourCustomCell: UICollectionViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = backgroundColor // Tricky to re-apply the background color
    }
}
nahung89
quelle
Funktioniert für mich, wenn ich es in eine Kategorie wie "@implementation UITableViewCell (fixiPadColors)" einfüge.
LPG
sollte nicht so machen. Ich bevorzuge in Ihrem Fall die @ Ray W-Lösung. Überprüfen Sie hier für den Grund stackoverflow.com/questions/9424004/…
nahung89
5

Dies löst dieses Problem für mich

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    tableView.backgroundColor = UIColor.clear
}
Ram Y.
quelle
3

Nach meiner Erfahrung haben einige Versionen von iOS die Hintergrundfarbe von UITableViewCell festgelegt, bevor die Delegierten aufgerufen wurden tableView:willDisplayCell:forRowAtIndexPath:. Das Zurücksetzen auf Ihre benutzerdefinierte Farbe in dieser Methode behebt das Problem.

Sterling Christensen
quelle
Ja, das ist die Lösung, auch wenn es seltsam ist! Ich habe es gefunden, als ich es mit dem iPad-Simulator iOS 8.2 ausprobiert habe, aber es war mit allen anderen iPhone-Versionen korrekt. Setzen Sie einfach [cell setBackgroundColor: [UIColor clearColor]]; zu dem oben genannten Ort.
BootMaker
Yah diese Antwort funktioniert auch, da ich dies bereits versucht habe, ich hatte das gleiche Problem in iOS 9 iPad tableveiw Zelle Hintergrundfarbe zu weiß ändern, während in allen iPhone
Waseem05
2

Swift 3.1

Ich habe diesen Fehler umgangen, indem ich ihn in meine UITableViewCellUnterklasse eingefügt habe:

Wenn die Zelle aus der NIB-Datei geladen wird:

override func awakeFromNib() {
    super.awakeFromNib()
    self.backgroundColor = UIColor.clear
}

und wenn die Zelle vom System wiederverwendet wird

override func prepareForReuse() {
    super.prepareForReuse()
    self.backgroundColor = UIColor.clear
}

iOS 10 soll dieses Problem in Interface Builder beheben, wie animeshporwal sagte.

Xavi Moll
quelle
2

SWIFT 3.XX.

Stellen Sie dies

UITableViewCell.appearance().backgroundColor = UIColor.clear

Im AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
Abhishek Mitra
quelle
1

Ich verwende Storyboardmit UITableViewControlrs, daher war die einfachste Entscheidung, alle Controller in Unterklassen zu unterteilen und diese Methode dem übergeordneten Controller hinzuzufügen

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
        cell.backgroundColor = [UIColor clearColor];
    }
}
d.rozumeenko
quelle
1

SCHNELL

Das passierte mir auch. Meine Tabellenansicht in meinem SWRevealViewController erschien auf meinem iPad weiß, als sie auf meinem iPhone klar aussah (so wollte ich es mit einem Hintergrundbild). Ich habe alles oben Genannte ausprobiert, aber dies hat in meinem viewDidLoad () für mich funktioniert.

tableView.backgroundView = UIImageView(image: UIImage(named: "gray"))
tableView.backgroundView?.backgroundColor = .clearColor()
UITableViewCell.appearance().backgroundColor = .clearColor()
AJ Hernandez
quelle
0

Dies kann in einem Storyboard wie folgt erreicht werden:

  • Zeigen Sie die Dokumentkontur für Ihr Storyboard an
  • Wählen Sie in Ihrer Tabelle eine TableViewCell aus
  • Wechseln Sie zur Inhaltsansicht in dieser Zelle
  • Legen Sie die Hintergrundfarbe der Inhaltsansicht fest.

Ergebnis: Die Ansichten des iPad- und iPhone-Simulators sehen gleich aus

Mark80
quelle
0

Ich hatte gerade dieses Problem und habe es behoben, indem ich die Hintergrundfarbe der Ansicht geändert habe (im Gegensatz zu der der tableView). Scheint auf dem iPad, das ist das, was zuerst verwendet wird und in meinem Fall wurde es auf Weiß gesetzt.

Diego Rebosio
quelle
0

SCHNELL Ich hatte auch dieses Problem. Funktioniert gut auf .phone, aber tableViewCells werden auf .pad weiß. Ich dachte, ich würde zeigen, wie ich es mit Swift behoben habe.

Verbinden Sie die tableViewCell mit der viewController.swift als @IBOutlet wie folgt:

    @IBOutlet weak var tvc1: UITableViewCell!
    @IBOutlet weak var tvc2: UITableViewCell!
    @IBOutlet weak var tvc3: UITableViewCell!

Fügen Sie dann in viewDidLoad Folgendes ein:

tvc1.backgroundColor = tvc1.backgroundColor
tvc2.backgroundColor = tvc2.backgroundColor
tvc3.backgroundColor = tvc3.backgroundColor

Sehr seltsam, ich weiß nicht, was hier passiert, aber das hat es für mich gelöst.

Steve
quelle
0

Dies scheint mit iOS 10 Beta 4 behoben zu sein, wie in den Versionshinweisen unter UIKitAnmerkungen erwähnt:

Geben Sie hier die Bildbeschreibung ein

Animesh Porwal
quelle
0

Ich habe eine transparente Tabellenansicht mit halbtransparenten Tabellenansichtszellen. Ich habe die Hintergrundfarbe der Tabellenansicht so eingestellt, dass sie beim Erstellen der Tabelle gelöscht wird. Dies funktioniert für alle iOS / Geräte-Kombinationen mit Ausnahme von iPad + iOS 8, bei denen die Hintergrundfarbe weiß bleibt.

Für mich funktioniert es, die Hintergrundfarbe der Zelle auf halbtransparent und die Hintergrundfarbe der Inhaltsansicht auf klar zu setzen, da ich dies bei jedem mache tableView(_ tableView: UITableView, cellForRowAt indexPath) . Das Problem für mich war nur, dass der Hintergrund der Tabellenansicht weiß blieb.

Ich habe alle Kombinationen ausprobiert, die ich in Bezug auf dieses Problem gefunden habe, aber das einzige, was ich tatsächlich tun musste, war, den Hintergrund der Tabellenansichten für jede auf transparent zu setzen tableView(_ tableView: UITableView, cellForRowAt indexPath). Nicht sehr intuitiv, aber es funktioniert zumindest. : P.

Daniel Saidi
quelle