6

Ich verfüge über eine benutzerdefinierte Tabellenansichtszelle, die das automatische Layout verwendet und über einen Offenlegungsindikator als Zubehöransicht verfügt. Die Zellengröße der Zellen auf dem Bildschirm ist völlig falsch, wenn zuerst angezeigt:Benutzerdefiniertes UITableViewCell mit automatischer Layout- und Zubehöransicht

Wie Sie die Zelle sehen können über einen 1,5-Bildschirme im Wert von Raum nimmt:

enter image description here

Allerdings, wenn ich drehe und das Gerät drehen zurück es sieht gut aus:

enter image description here

Wie man hier sehen kann, ich habe nichts getan kompliziert:

enter image description here

Ich habe eine sehr nicht-ideale Problemumgehung, die zu tun ist:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView reloadData]; 
} 

Aber das offensichtlich verursacht eine ‚Flash‘, wenn Sie zum ersten Mal auf den Bildschirm sehen. In einem komplizierteren Szenario ist der Blitz viel offensichtlicher.

Ich habe ein anderes Problem zu umgehen, aber dies bewirkt, dass eine automatische Layout Ausnahme:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath]; 
    cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 
    [cell.basicLabel layoutIfNeeded]; 
    return cell; 
} 

Ausnahme:

enter image description here

Mindestens diese Methode nicht gibt mir UI blinkt.

Wenn ich die Zubehöransicht entferne, funktioniert es wirklich perfekt.

UPDATE: Ich habe ein Beispielprojekt GitHub hinzugefügt: https://github.com/fwaddle/TableCellAccessoryTest

UPDATE # 2: eine andere Arbeit stellte sich heraus, um diesen Fehler die Zelle in Code Layout ist. Ich habe gerade versucht, das gleiche in Code zu tun, und es hat nicht die Warnung geworfen und hat gut funktioniert. Sieht wie ein IB-Fehler aus.

Irgendwelche Ideen, wie Sie dieses Problem umgehen können? Danke.

+0

Setzen Sie Ihre Abhängigkeiten richtig in Ihrer Zelle, was manchmal schwierig sein kann, und setzen Sie dann die 'rowHeight'-Eigenschaft in Ihrer Tabellenansicht auf 'UITableViewAutomaticDimension'. Auch das ist keine Ausnahme, das ist eine Warnung vor Fehlkonfigurationen. Eine nicht abgefangene Ausnahme beendet Ihre Anwendung. – Michael

+0

Hi @Nikita, Die Einschränkungen sind richtig eingestellt und ich habe die rowHeight korrekt eingestellt: - (void) viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 45; } Aber ich nehme Ihren Punkt darüber, keine Ausnahme zu sein. – Mof

+0

Ich denke, das ist ein Problem mit Ihren Einschränkungen. Säubern Sie Ihr Build und entfernen Sie Constraints, die nicht im Layout verwendet werden, und erstellen und führen Sie sie dann aus. – Michael

Antwort

0

So Erstellung auch die Einschränkungen im Code manchmal dieses Problem nicht beheben. Es scheint, du brauchst noch ein paar Änderungen. In Ihrer Zelle benutzerdefinierten Tabelle fügen Sie die folgende vor allem, wenn Sie den Zubehörtyp sind zu ändern, je nach Inhalt der Zelle (zB Haken):

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType { 
    [super setAccessoryType:accessoryType]; 
    [self setNeedsUpdateConstraints]; 
} 

Auch die Prototyp-Zelle in dem Storyboard entfernen und Ihre Klasse registrieren statt:

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"]; 
} 

finde ich gelegentlich, dass ich noch Etiketten zu zwingen (insbesondere mehrzeiligen Etiketten wie es scheint) Layout in cellForRowAtIndexPath wieder:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath]; 
    cell.customLabel.text = ..... 
    [cell.customLabel layoutIfNeeded]; 
    return cell; 
} 

Alle oben genannten Punkte haben meine Probleme behoben, also hoffe ich, dass sie für andere von Nutzen sind, und du verschwendest keine große Zeit damit.

Ich habe noch nichts von Apple über den Bug-Bericht gehört, aber ich nehme an, das ist ziemlich normal.

3

Implementieren Sie die folgende Delegate-Methode, da dies das Problem für mich löste.

- (void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath 

eine Tabellenansicht sendet diese Nachricht an seinen Delegierten kurz bevor es Zelle verwendet eine Reihe zu ziehen, wodurch die Delegierten ermöglicht die Zellobjekt anpassen, bevor sie angezeigt wird. Diese Methode gibt dem Stellvertreter eine Chance, statusbasierte Eigenschaften zu überschreiben, die zuvor in der Tabelle festgelegt wurden, z. B. Auswahl und Hintergrundfarbe. Nachdem der Delegat zurückgegeben wurde, werden in der Tabellenansicht nur die Eigenschaften alpha- und frame und nur dann festgelegt, wenn Zeilen beim Ein- oder Auslagern animiert werden.

diesen Code auf Ihre Tableviewcontroller hinzu:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 

    BasicCell *basicCell = (BasicCell *)cell; 
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 

} 
+0

Obwohl Ihre Lösung die beste Arbeit bisher ist, ist sie immer noch nicht perfekt. Ihre Lösung produziert immer noch Zellen, die zu hoch sind. Sehen Sie, was passiert, wenn Sie das Gerät im Uhrzeigersinn und dann zurück drehen. Sie werden bemerken, dass die Zellen kleiner werden und der Säugling auf die richtige Höhe kommt. Ich habe auch einen Fehlerbericht mit Apple eingereicht, da dieser wie ein iOS-Bug aussieht. – Mof

Verwandte Themen