2016-04-06 15 views
1

Ich habe Zellen, die aus einem Titel, Datum und einer Anzahl von Hashtags bestehen.Dynamische Höhe UITableViewCell

Hier ist der Screenshot Storyboard:

Custom cell in storyboard

ich folgendes in meinem ViewDidLoad festgelegt haben:

tableView.rowHeight = UITableViewAutomaticDimension 

Aber haben nicht gegeben jede estimatedHeight für die Tableview, die ich erklären werde Warum.

Hier ist meine customCell:

@IBOutlet weak var title: UILabel! 
@IBOutlet weak var date: UILabel! 
@IBOutlet weak var hashtagsView: UIView! 

var item: Item? { 
    didSet { 
     configureCell() 
    } 
} 

func configureCell() { 
    if item = item { 
     title.text = item!.title 
     date.text = item!.date 

//  The part where I calculate the sizes of hashtags to fit them in hashtagsView 

     let totalWidth = CGRectGetWidth(hashtagsView.frame) 
     print("TotalWidth: \(totalWidth)") 
     . 
     . 
     . 
     . 
     print("Content: \(self.contentView.frame)") 
     print("HashtagsView: \(self.hashtagsView.frame)") 
    } 
} 


Hier die Ergebnisse ist:

Mit tableView.estimatedHeight = 150

TotalWidth: 240.0 
Content: (0.0, 0.0, 240.0, 119.666666666667) 
HashtagsView: (0.0, 0.0, 240.0, 128.0) 


Ohne estimatedHeight

TotalWidth: 240.0 
Content: (0.0, 0.0, 414.0, 43.6666666666667) 
HashtagsView: (0.0, 0.0, 240.0, 128.0) 


Recap

Wenn es eine estimatedHeight, content Zelle nicht eine richtige Breite druckt, sondern zeigt den Inhalt der Zelle gut wie nichts falsch ist (mit Ausnahme der hashtagsView).

Wenn es keine geschätzte Höhe gibt, druckt die contentView der Zelle tatsächlich die richtige Breite, wodurch ich die Hashtags-Frames berechnen kann, aber die Zellen werden mit ihrer Standardgröße 44 angezeigt.


Detaillierte Info

Da ich weiß nicht, wie viele Hashtags da ist, ich versuche, die leere UIView zu verwenden, um die UIButtons programmatisch hinzuzufügen. Und zur Berechnung der Hashtags-Buttons muss ich die "width" der contentView der Zelle oder der hashtagsViews haben, aber wenn ich tableView.estimatedHeight setze, ist die Zellenbreite eine beliebige Zahl (zB 240 in 6s Plus Simulator) . Und ich kann die HashtagsView Breite nicht bekommen, obwohl ich keine Auto-Layout Probleme habe.

Und wenn ich eine Schätzung nicht geben tableView.estimatedHeight, erhalte ich folgendes:

Custom cells without estimatedHeight


aktualisiert - Ein Update gestellt von @EarlGray in den Kommentaren

Die Hashtags sind eigentlich UIButtons, die ich der HashtagsView dynamisch hinzufüge. Ich muss die Höhe des hashtagsView so strecken, dass es mehr als eine Zeile von Hashtags passt.

Ich denke, ich muss entweder UIView subclass und override layoutSubviews() überschreiben, um ein passendes vertikales Layout zu erreichen oder jeder Unteransicht (UIButtons) programmatisch Constraints hinzuzufügen.

tun, was @VinodVishwanath sagte, das Setzen von estimatedRowHeight mit expliziten Höhen kombiniert und vertikalen räumlichen Gegebenheiten gibt mir dies:

Welche unables mir die Breite des hashtagsView zu bekommen. Während die Berechnungen der UIButtons' Frames, muss ich die Breite des cell.contentView, aber irgendwie die estimatedRowHeight Einstellung gibt mir die folgenden Koordinaten für die cell.contentView.frame

Content: (0.0, 0.0, 240.0, 119.666666666667) 

was es ist falsch, weil es hat Gib 414, und deshalb beginnen meine Hashtags von der Hälfte des Bildschirms.

Kommentar aus tableView.estimatedRowHeight gibt mir die richtigen Koordinaten:

Content: (0.0, 0.0, 414.0, 43.6666666666667) 

Aber vermasselt meine Tableview etwa so:


Update # 2 - Hier ist meine Einschränkungen für die cell.contentView

ContentView's constraints


Update # 3 - Ein Haltepunkt auf meinem configureCell Verfahren

HashtagsView's superview returns nil!!

ich verstehe es nicht, meine UIView IBOutlet angeschlossen ist, ich doppelt geprüft.

Alle contentViewviews haben falsche Frames. So auch die superview-less hashtagsView.

Aber wenn ich geschätztRowHeight entferne, betrachtet es plötzlich HashtagsView als Unteransicht der Zelle contentView. Mit Ausnahme von contentView geben Subviews-Frames immer noch falsche und negative Werte zurück.

+0

Dieser Link kann Ihnen helfen, die Höhe der Zelle zu berechnen: http://Stackoverflow.com/a/36095091/3918500 –

+0

Können Sie bitte Ihren Beitrag aktualisieren, um explizit zu bestätigen oder zu leugnen, ob Sie Live-Bearbeitung mit Multiline-Unterstützung unterstützen möchten ? Damit meine ich, wenn ich genug Hashtags gesetzt habe, werden sie zur nächsten Zeile überlaufen? –

+0

@EarlGrey Ja, ich möchte das unterstützen. Aber ich glaube nicht, dass es Live-Bearbeitung ist oder ich dich nicht ganz verstanden habe. Weil ich nicht möchte, dass der Benutzer etwas bearbeitet. Ich möchte nur die Hashtags in die nächste Zeile fließen, ohne die Self-Sizing-Custom-Tabelle zu ruinieren – Mehrdadmaskull

Antwort

0

Wenn Sie die geschätzte Zeilenhöhe nicht angeben, beträgt die Zellenhöhe standardmäßig 44, und deshalb erhalten Sie eine Inhaltshöhe von 43,667.

Sie müssen die geschätzte Zeilenhöhe angeben. Dies ist die Höhe, wenn im Feld keine Tags vorhanden sind. Dann ist alles, was benötigt wird, um die richtige Höhe dynamisch einzustellen, der richtige Satz von automatischen Layout-Einschränkungen, um die intrinsische Größe der contentView zu liefern.

Dies wird geschehen, wenn Sie eine vertikale Raumbegrenzung zwischen allen Subviews von contentView gesetzt, ein topSpaceToSuperview und bottomSpaceToSuperview einschließlich der Autolayout-Engine zu ermöglichen, die innere Gehalt Größe zu berechnen.

bearbeiten

ich Ihre Einschränkungen aus dem Screenshot analysiert haben, und hier sind die entsprechenden Einschränkungen Sie die Zellenhöhe zu berechnen hinzugefügt haben:

  • Title.top = topmargin + 8
  • bottomMargin = Teilen Button.bottom
  • Link.centerY = Teilen Button.centerY
  • Hashtags View.top = Title.bottom
  • Date.top = Hashtags View.bottom + 15

Jetzt ist hier eine visuelle Darstellung dieser Einschränkungen:

TopMargin

|

Titel

|

Hashtags Ansicht

|

Datum

!!! defekter Link !!!

Link - Share Taste

|

Bottom

Die unterbrochene Verbindung verhindert, dass die Layout-Engine aus der Berechnung der Zellenhöhe. Sie müssen die fehlerhafte Verknüpfung im vertikalen Layout beheben, indem Sie beispielsweise Date.centerY = shareButton.centerY oder Date.top = HashtagsView.bottom festlegen.

+0

Ich glaube, ich habe das probiert, indem ich jeder Subview explizite Höhen gegeben habe. Ich werde das nochmal versuchen, wenn ich aufwache und bestätige es. – Mehrdadmaskull

+0

Abgesehen von jeder Unteransicht mit expliziten Höhen muss zwischen den Untersichten und einer Oberraum- und einer Unterraumbeschränkung für die Superansicht (von der obersten Unteransicht bzw. der untersten Unteransicht) eine vertikale Raumbeschränkung bestehen. –

+0

Ich habe versucht, vertikale Leerzeichen Einschränkungen und explizite Höhe auf der HashtagsView mit geschätztRowHeight gesetzt, aber die Einstellung geschätztRowHeight ermöglicht es mir, die richtige Breite von cell.contentView zu erhalten! Ich weiß nicht, warum ratedHowHeight die Breite von contentView ändert! Es gibt mir das: Inhalt: (0.0, 0.0, 240.0, 119.6666666666667) Sehen Sie sich meinen aktualisierten Beitrag über – Mehrdadmaskull

Verwandte Themen