2014-10-14 7 views
16

Hier ist, wie ich meine Tabelle:IOS 8 UITableView Selbst Sizing Zellen jump/shift visuell, wenn ein neuer View-Controller gedrückt wird

self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
self.tableView.delegate = self; 
self.tableView.dataSource = self; 
self.tableView.estimatedRowHeight = 150; 
[self.view addSubview:self.tableView]; 

Innerhalb meiner Zellen, ich - (CGSize)sizeThatFits:(CGSize)size rufe programmatisch die Höhe zurück (was set in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. ich bin Einschränkungen oder automatisches Layout nicht verwenden.

Nichts komplex und meine Höhen sind visuell alle perfekt angelegt.

aber das Problem ist, wenn ich einen neuen view-Controller drücken, die Zellen springen/shift visuell (entweder hoch oder runter). Es scheint zu springen, basierend auf der Berechnung der geschätzten Zeilenhöhe Werte - aber sizeThatFits wird auch für jede sichtbare Zelle vor dem Verschieben aufgerufen, so dass ich wirklich verwirrt bin (nicht sicher, warum überhaupt wirklich aufgerufen werden muss, da ich die verlassen Aussicht). Ich habe das contentOffset für das TableView überprüft - es ist unverändert, also ist es nicht das Problem.

Antwort

6

Okay, ich löste es, indem ich meine Zellenhöhen in sizeThatFits zwischenspeichere und diesen Wert für geschätzte Zellenhöhen innerhalb des Delegaten zurücksende. Funktioniert wunderbar.

+0

Könnten Sie Ihre Antwort näher erläutern, @vadoff? Ich kenne eine Reihe von Workarounds, aber nicht diese. – rainypixels

+0

@rainypixels hast du es jemals herausgefunden? – Steve

+0

@Steve Ich habe eine Reihe von Optionen, aber ich habe keine ausgewählt. Ich werde wahrscheinlich gehen mit Caching die Höhen (Schlüssel = ID der Zelle + Datum der letzten Änderung, Wert = Höhe) mit NSCache. Ich hatte gehofft, Vadoff hätte eine andere/elegantere Lösung. – rainypixels

3

Quick Fix:

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    self.tableView.reloadData() 
} 

Edit: Nach Stunden auf diese und ähnliche Fragen zu verbringen ich die beste Lösung gefunden haben, ist die Zellhöhen zwischenzuspeichern und bringt sie in estimatedHeightForRowAtIndexPath Delegatmethode, das Problem verursacht durch geschätzte Höhen sind wirklich ungenau.

Ich habe die Höhen in tableView (_: willDisplayCell: forRowAtIndexPath :) in ein Wörterbuch mit den eindeutigen IDs für die Daten als Schlüssel auf diese Weise zwischengespeichert, wenn Daten hinzugefügt oder aktualisiert werden. Ich kann diese Höhe einfach aus dem Cache entfernen und besser verwenden geschätzte Höhen, so dass nur die Zelle eine geschätzte Höhe verwendet. Bis jetzt löst das alle meine Jumping- und Scroll-Probleme.

+0

Sir, du bist Genie! Funktioniert gut für mich. –

+0

Wenn Sie nach unten scrollen, verschiebt sich tableView immer noch. – tounaobun

Verwandte Themen