2016-04-05 6 views
0

Mein UIView des stapeln wie so übereinander up:Welche Einschränkungen würden verhindern, dass meine UIViews übereinander gestapelt werden?

enter image description here

Jeder UIView ist in einem wordContainer. Jeder UIView hat zwei UILabel ‚s in der es

schaffe ich jedes einzelne UIView mit zwei Kind UILabel ist wie so:

var labels = [UIView]() 
    for word in words { 

     let wordLabel    = UILabel(frame: CGRectZero) 
     wordLabel.text    = word.valueForKey("sanskrit") as? String 
     wordLabel.numberOfLines  = 0 
     wordLabel.sizeToFit() 
     wordLabel.translatesAutoresizingMaskIntoConstraints = false 

     let englishWordLabel   = UILabel(frame: CGRectMake(wordLabel.frame.width + 10,0,0,0)) 
     englishWordLabel.text   = word.valueForKey("english") as? String) 
     englishWordLabel.numberOfLines = 0 
     englishWordLabel.sizeToFit() 
     englishWordLabel.lineBreakMode  = .ByWordWrapping 
     englishWordLabel.translatesAutoresizingMaskIntoConstraints = false 

     let wordView = UIView(frame: CGRectMake(0,0,self.view.frame.width,englishWordLabel.frame.height)) 
     wordView.translatesAutoresizingMaskIntoConstraints = false 
     wordView.addSubview(wordLabel) 
     wordView.addSubview(englishWordLabel) 

     wordView.sizeToFit() 

     labels.append(wordView) 
    } 

Dann nehme ich diese Sammlung von UIView ist und fügen Sie sie in meine wordContainer. Dies ist der Teil, wo ich mir vorstelle, ich sollte NSLayoutConstraints setzen. Die Idee ist, dass ich möchte, dass sie alle richtig übereinander liegen. Zum Beispiel sollte es so aussehen:

word: definition 
word: definition 
word: definition 
word: definition 

Aber stattdessen sieht es wie folgt aus:

enter image description here

Ich füge sie in die wordContainer wie so:

let wordContainer = UIView(frame: CGRectZero) 

    var currentY:CGFloat  = 0.0 
    let margin_height:CGFloat = 4.0 
    var height:CGFloat  = 0 

    for view in wordViews { 
     var rect = view.frame 
     rect.origin.y = currentY 
     view.frame = rect 

     currentY += view.frame.height 
     height += view.frame.height 

     wordContainer.addSubview(view) 

    } 
    let containRect = CGRectMake(0,0,self.view.frame.width, height) 
    wordContainer.frame = containRect 

Und dann Ich setze meine Beschränkungen für die wordContainer, die wirksam den Raum für alle Wörter ermöglicht, wenn sie nicht auf eac gestapelt wurden h andere:

wordContainer.bottomAnchor.constraintEqualToAnchor(cell.contentView.bottomAnchor).active  = true 
    wordContainer.topAnchor.constraintEqualToAnchor(cell.contentView.topAnchor).active   = true 

Meine neueste Idee ist, dass ich vielleicht Einschränkungen hinzufügen sollte. Ich habe experimentiert mit NSLayoutConstraints auf die Höhe der cell, und wenn ich alle Wörter nicht mehr richtig ausgelegt sind. Stattdessen sind sie übereinander gestapelt. Aber das scheint die richtige Richtung zu sein.

+2

Sie können 'UITableViewAutomaticDimension' nicht verwenden, ohne das automatische Layout zu verwenden – dan

+0

@dan von autolayout, beziehen Sie sich auf IB Visual? – Trip

+0

Mit Auto-Layout bedeutet das Hinzufügen von Einschränkungen zu den Ansichten.Sie sollten wirklich ein "UIStackView" dafür verwenden, anstatt zu versuchen, Ihre Ansichten manuell mit Einstellungsrahmen zu stapeln. – dan

Antwort

2

Damit die Zelle ihre Höhe automatisch anpassen kann, muss Ihr Inhalt innerhalb der contentView Einschränkungen für alle 4 Kanten des contentView haben.

Ich habe das gerade selbst mit verschiedenen Zelltypen für Text, Bilder und eingebettete Tweets gemacht und hatte einige der Probleme, die Sie beschrieben haben. Ich fand den einfachsten Weg, eine Ansicht um alle Komponenten innerhalb der Inhaltsansicht hinzuzufügen, und dann können Sie die Beschränkungen ganz einfach zu diesem Element hinzufügen.

Ich habe mich gerade nach etwas umgeschaut, das das demonstrieren kann, und habe einen anderen gefunden, der es mit ein paar Screenshots erklärt: SO answer.

Auch der Hinweis I verwendet wird, wenn dies heute This post on Ray Wenderlich's site

+0

Danke fürs schreiben. Ich habe gestern einige Zeit mit diesem speziellen SO-Post verbracht. Kopiere den Code in meins und dehne die Einschränkungen für den 'wordContainer' auf seine übergeordnete' cell' - ich sehe, dass sich 'cell.frame.size.height' tatsächlich ändert, aber die Zelle immer noch bei' 44.0 öffnet ', und die Subviews verlieren ihren Abstand und stapeln sich übereinander. – Trip

+0

Ihre Einstellungen sehen oben gut aus, es sind nur Ihre Einschränkungen. Sie sollten keine Höhen festlegen, da diese basierend auf dem Inhalt berechnet werden. Sie müssen jedoch den Abstand zwischen der oberen Beschriftung und dem oberen Rand der Inhaltsansicht festlegen. Oben auf dem zweiten Label und unten auf dem oberen Label und dann unten auf dem zweiten Label und unten in der Inhaltsansicht. (Und die Seiten) – Scriptable

+0

Ah ok interessant. Mit "Abstand" meinst du die Einschränkungen oder die Höhe/Breite? – Trip

0

In Ihrem UITableViewController, in viewDidLoad() war zu tun, versuchen:

//set up table view cell dynamic height 
tableView.rowHeight = UITableViewAutomaticDimension 

Im Storyboard, stellen Sie sicher, verwenden Sie Automatisches Layout und dass alle Bedingungen Die Elemente Ihrer Zelle zur Superansicht sind festgelegt und behoben. Der oberste Text Ihrer Zelle muss beispielsweise seinen Rand für Superview definiert und auf einen Wert festgelegt werden.

+0

Das steht in meiner Antwort oben geschrieben. – Trip

Verwandte Themen