2016-07-03 28 views
0

Ich habe keine Probleme hier zu versuchen, diese Post Beschreibung Etikett zu wachsen und zu verkleinern basierend auf Inhalt Größe auf IOS9. Ich habe eine Sicht (ich werde es topView beziehen), die ich als Kopfzeile für die Tabellenansicht verwende (also wenn ich nach oben scrolle, verschwindet die Überschrift). In der TopView gibt es eine Reihe von Stack-Ansichten. Ich möchte das Postbeschreibungsetikett in der Größe basierend auf der Inhaltsgröße vergrößern und verkleinern. Ich weiß, wie man es in einem einfachen Fall macht, wo alles innerhalb der Prototypzelle ist (d. H. Geschätzte Zeilenhöhe einstellen und uitaviewautomaticDimensions setzen, sizetoFit auf Label setzen und Anzahl der Zeilen auf 0 setzen). Dies ist jedoch ein anderer Fall, da sich das Post-Beschreibungslabel nicht wirklich in der Zelle befindet, sondern in seiner Ansicht vor den Zellen der Tabellenansicht.Dynamische UILabel Größe für Ansicht vor uitableview

Beachten Sie, dass alle Elemente in der Ansicht eine statische Höhe haben, mit Ausnahme des Postdescription-Labels. Post-Beschreibungs-Label befindet sich in einer Stapelansicht, die nur links und rechts angeheftet ist (sodass oben und unten wachsen würden?). Außerdem ist die Hauptstapelansicht, die alle Elemente enthält, an den vier Seiten mit der Draufsicht angeheftet, die die Hauptstapelansicht enthält, die ebenfalls an die vier Seiten angeheftet ist. Mit dieser Einrichtung würde ich erwarten, dass die Topansicht basierend auf der Inhaltsgröße wächst und schrumpft. Allerdings sehe ich das nicht in der Ausgabe. Ich weiß nicht, ob es die Stapelansicht ist, die das Etikett nicht wachsen lässt oder die Draufsicht nicht wachsen lässt, um mehr Platz für die Stapelansicht für das Etikett zu lassen. Dank

dynamic uilabel

UPDATE

Dank Riadluke, versuchte ich etwas wie vorgeschlagen, die die headerview ist Ändern der Größe nach der erforderlichen Höhe zu berechnen. Ich habe den folgenden Code in viewDidLayoutSubview gesetzt und es funktioniert mit einem Problem

postDescriptionLbl.sizeToFit() 


let headerView = commentTableView.tableHeaderView! 

headerView.setNeedsLayout() 
headerView.layoutIfNeeded() 

let height = TopStackView.frame.size.height + ImageStackView.frame.size.height + postDescriptionLbl.frame.size.height + SpacerStackView.frame.size.height + BottomStackView.frame.size.height 
headerView.frame.size.height = height 
commentTableView.tableHeaderView = headerView 

Das Problem, das ich jetzt mit dieser Methode ist, dass, wenn die View-Controller angezeigt wird, ich physisch die postDescription Etikettenhöhe von der Standardhöhe wachsen sehen kann im Storyboard auf die gewünschte Höhe. Zum Beispiel, wenn der VC zuerst erscheint, sehe ich eine Zeile mit einem Etikett, wobei eine Zeichenfolge abgeschnitten wird, aber nach 0,5 Sekunden wachsen die Kopfzeile und das Etikett auf die gewünschte Größe. Ich weiß, dass dies erwartet würde, weil ich die Manipulation nach der viewDidLayout Subview aufruft. Ich habe mich gefragt, ob es einen besseren Weg gibt, so dass ich diesen Übergang nicht sehe und die Aussicht scheint sofort die richtige Höhe zu sein. Ie. Lassen Sie die Ansicht genau wissen, wie hoch das Label ist, um zu bestimmen, wie hoch die Headeransicht sein muss, bevor sie auf dem Bildschirm erscheint?

Antwort

0

Ich fürchte, die Ansicht als tableHeaderView von UITableView wird nicht automatisch die Größe geändert. Seine Höhe wird auf die Höhe festgelegt, die es in IB hatte. Sie müssen die Größe manuell festlegen und sie dann als tableHeaderView neu zuweisen, damit sie in der gewünschten Höhe angezeigt wird.

Es kann nur ein paar Zeilen dauern, da Sie das automatische Layout verwenden. Sie können diesen Code versuchen, unmittelbar nachdem Sie den Inhalt der Kopfansicht festgelegt haben:

//for the target size you have set the width as your tableView's width when it is already displayed on screen. 
    //note that when it is accesed inside viewDidLoad the tableView's bounds 
    //may be different to the actual bounds it will be displayed with, 
    //here I am just using the screen bounds 
    let targetSize = CGSize(width: UIScreen.mainScreen().bounds.width, height: 10000) 

    //set the tableHeader's size to its size after its layout constraints are resolved 
    tableHeader.bounds.size = tableHeader.systemLayoutSizeFittingSize(targetSize) 

    //reassign it as the tableHeaderView to update the height it will be displayed in 
    tableView.tableHeaderView = tableHeader 
+0

Danke für die Antwort riahluke. Irgendeine Idee über das Update oben? Danke – user172902

+0

hast du systemLayoutFittingSize ausprobiert und es in viewDidLoad aufgerufen? – riadhluke

0

Nach vielen vielen Versuchen konnte ich nichts bekommen mit dem ursprünglichen Setup zu arbeiten. Das Beste, was ich erreicht habe, war es, die Größe zu ändern, nachdem die Ansicht aufgetaucht ist, was keine Idee ist, wie Sie das vorherige Layout sehen.

Es arbeitet jetzt mit einem komplett anderen Ansatz. Ich habe zwei Prototyp-Zelle erstellt und haben ein als „HeaderViewCell“ und implementiert die folgenden Funktionen

commentTableView.estimatedSectionHeaderHeight = 400 
commentTableView.sectionHeaderHeight = UITableViewAutomaticDimension 
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

Alles wie ein Zauber, nachdem das funktioniert.