2016-09-09 3 views
1

Ich verwende Auto-Layout, um die Höhen der Zeilen in UITableView, wie beschrieben here. Dieser Teil funktioniert.Vertikale Mehrdeutigkeit in Auto-Layout-Größe UITableView Zeilen

ich stapeln einige Etiketten, so dass sie aussehen wie dies im Interface Builder:

enter image description here

Die Einschränkungen sind das, was man erwarten würde, V:|-lab1-lab2-lab3-|. Das Problem ist, dass es zweideutig ist und verlangt, dass Sie die Prioritäten für den vertikalen Inhalt ändern.

Es sollte nicht mehrdeutig sein. Die Beschriftungen sollten die Höhe der Zeile definieren. Aber IB scheint die Höhe der Zeile zu nehmen, die Sie auf IB ziehen können, als etwas, das die Beschriftungen einschränkt, wenn es wirklich zur Laufzeit ist, dass der Etiketteninhalt die Höhe der Zeile bestimmt . In diesem Bild ist die Zeilenhöhe etwas größer als es zur Laufzeit sein sollte, so dass die grüne Beschriftung von ihrem Textinhalt weggezogen wird, und IB beginnt, nach Inhalt zufrieden stellenden Prioritäten zu fragen. Normalerweise würde ich dieses Problem lösen, indem ich auf "Frames aktualisieren" klicke, was die Zeilenhöhe auf die Label-Höhe herunterziehen würde, aber "Frames aktualisieren" hat keinen Einfluss auf Zeilenhöhen in UITableView.

Gibt es einen Standard Weg, dies zu lösen? Ich würde denken, dass Leute die ganze Zeit schlagen, wenn sie Auto-Layout für Zeilenhöhen verwenden.

Antwort

0

Das Problem hier ist, dass Ihre Einschränkungen keine explizite Höhe für jede Etiketten angeben und es scheint, dass die Höhe Ihrer Zelle auf einen bestimmten Wert festgelegt ist.

Zuerst müssen Sie die Tabellenansicht UITableViewAutomaticDimension im Verfahren heightForRowAtIndexPath

wie dies in obj-c verwenden lassen:

-(CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    return UITableViewAutomaticDimension; 
} 

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

Dann müssen Sie Höhe Ihrer Etiketten beheben:

  • Entweder indem Sie sie einander gleich setzen. Auf diese Weise kann Ihre Zelle ihre Größe berechnen.
  • Oder Sie erlauben ihnen, indem ein Etikett Inhalt umarmen Priorität zu niedrig aufwenden (das ist, was Sie gerade tun)

In Ihrem Fall scheint es, dass Sie jedes Etikett wollen die gleiche Höhe haben, so die erste Lösung sollte funktionieren;)

+0

Ich weiß über 'UITableViewAutomaticDimension' und dieser Teil ist eingerichtet. Das Bild stammt vom Interface Builder, nicht von der Benutzeroberfläche zur Laufzeit.Ich sollte keine expliziten Höhen für Beschriftungen angeben müssen, da sie ihre Höhe von ihrem Text nehmen, und die Summe sollte die dynamische Zeilenhöhe ergeben. –

+0

Ich habe meine Frage um einige Details und Erklärungen erweitert. Ich finde es schwierig, dieses Problem zu erklären. –

+0

Hey Rob N, eigentlich wenn ich sagte "Fix Höhe" ich meine nicht explizite Höhe. Ich meinte, du solltest die Höhe des ersten Etiketts gleich dem zweiten, gleich dem dritten, einstellen. Dadurch werden ihre Höhen zur Laufzeit festgelegt, und Sie werden mit dem Layout enden, das ich denke, dass Sie erwarten (alle Etiketten mit der gleichen Höhe) – RomOne

0

Ich fand eine Lösung, die für mich funktionierte. Es tut mir leid, dass die folgende Erklärung hand-wavey ist, aber es ist besser, als ich selbst tun kann. Es ist hier angesprochen (https://useyourloaf.com/blog/table-view-cells-with-varying-row-heights/) unter dem Abschnitt Auto-Layout der Prototypzelle.

Auto-Layout weiß nicht, dass wir die Größe der Inhaltsansicht anpassen werden, um sicherzustellen, dass beide Etiketten passen. Es erwartet daher einen Hinweis darauf, welches Etikett zuerst expandieren oder komprimieren sollte, um es an den Platz anzupassen. Um die Warnung zu entfernen, senkten Sie den vertikalen Kompressionswiderstand und erhöhten die vertikale Umgehungspriorität des Liniennummernlabels, so dass es bei seiner inneren Größe bleiben möchte.