2016-06-16 16 views
2

Ich bin ziemlich neu zu Swift und ich stolperte über ein Problem. Ich hole einige JSON-Daten und zeige sie in einer TableView, aber das Problem ist, dass jede Zelle n Nummern der Beschriftungen untereinander haben kann (aus der JSON (, also die Zellen müssen unterschiedliche Menge an Inhalt haben. Wie kann ich das erreichen ?Höhe anpassen an Inhalt in TableView Zelle?

EDIT:.. ich kann es nicht wirklich an der Arbeit, Im dies zu tun mehr Etiketten hinzuzufügen, wenn der Tableview erstellt In meiner benutzerdefinierten Zelle

func addViews() { 
    let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90) 
    containerView.backgroundColor = UIColor.lightGrayColor() 

    let view1 = UIView(frame: rect) 
    view1.layer.shadowColor = UIColor.blackColor().CGColor 
    view1.layer.masksToBounds = false 
    view1.layer.shadowOpacity = 0.2 
    view1.layer.shadowOffset = CGSizeMake(-1, 1) 
    view1.layer.cornerRadius = 2 
    view1.backgroundColor = UIColor.whiteColor() 

    var x = 2 as CGFloat 
    var y = 2 as CGFloat 
    var position = CGPointMake(x, y) 
    i in 1...5 { 
     let recti = CGRect(x: x, y: y, width: 50, height: 50) 
     let s = UILabel(frame: recti) 
     s.text = "\(i)" 
     y = y + 20 
     view1.addSubview(s) 
     print(i) 
    } 
    containerView.addSubview(view1) 
} 

Und ich habe diese beiden Zeilen hinzugefügt zu meinem TableViewController

self.tableView.rowHeight = UITableViewAutomaticDimension 
self.tableView.estimatedRowHeight = 100 

Aber es passt nicht an und zeigt nur t Das erste Etikett, bevor es die Zelle abschneidet.

Antwort

2

Richten Sie Ihre Beschriftungen in Ihrer benutzerdefinierten Zellklasse ein und verwenden Sie dann cellForRow, um die Daten zu senden.

import UIKit 


class cellClass: UITableViewCell { 


@IBOutlet weak var containerView: UIView! 


func addViews(jsonStuff: [String]){ 

    let rect = CGRect(x: 0, y: 0, width: 100, height: 20) 
    var x = 50 as CGFloat 
    let y = 20.0 as CGFloat 

    var position = CGPointMake(x, y) 

    for str in jsonStuff{ 

     let label = UILabel(frame: rect) 
     label.text = str 
     label.center = position 
     containerView.addSubview(label) 
     x = x + 40 
     //y = y + 20 
     position = CGPointMake(x,y) 

    } 


} 





} 



class ViewController: UIViewController, UITableViewDelegate,  UITableViewDataSource { 

@IBOutlet weak var table: UITableView! 

var stringStuff = ["this", "that", "tje", "blah", "hey"] 


override func viewDidLoad() { 
    super.viewDidLoad() 

} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return stringStuff.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as!  cellClass 
    if indexPath.row < 2{ 
     let sub = stringStuff[0...2] 
     cell.addViews(Array(sub)) 
    }else{ 
     cell.addViews(stringStuff) 
    } 


    return cell 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

} 

enter image description here

Dies ist wahrscheinlich ein riesiger Hack, und ich bin sicher, es gibt bessere Möglichkeiten, aber hier ist einige Funktionscode, der die Zeile dynamisch ohne Verwendung von automatischen Layout oder vordefinierten Etiketten Größe wird. Sie werden wahrscheinlich mit den richtigen Höhen herumspielen müssen, um alles richtig aussehen zu lassen, und die Untersichten zum Entfernen in cellForRowAtIndexPath werden für die Wiederverwendung von Zellen benötigt.

class cellClass: UITableViewCell { 

@IBOutlet weak var containerView: UIView! 

func addViews(lbsToAdd: Int) { 

    let rctHeight = Int((5 + (lbsToAdd * 20))) 

    let rect = CGRect(x: 6, y: 10, width: Int(containerView.frame.width-12), height: rctHeight) 

    containerView.backgroundColor = UIColor.lightGrayColor() 
    let view1 = UIView(frame: rect) 
    view1.layer.shadowColor = UIColor.blackColor().CGColor 
    view1.layer.masksToBounds = false 
    view1.layer.shadowOpacity = 0.2 
    view1.layer.shadowOffset = CGSizeMake(-1, 1) 
    view1.layer.cornerRadius = 2 
    view1.backgroundColor = UIColor.whiteColor() 

    let x = 2 as CGFloat 
    var y = 0 as CGFloat 

    for i in 1...lbsToAdd { 
     let recti = CGRect(x: x, y: y, width: 50, height: 20) 
     let s = UILabel(frame: recti) 
     s.text = "\(i)" 
     y = y + 20 
     containerView.frame.size.height = containerView.frame.size.height + 20 
     view1.addSubview(s) 
     print(i) 
    } 

    containerView.addSubview(view1) 

} 


} 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 


@IBOutlet weak var testTable: UITableView! 

var stringStuff = ["Jetta", "<Golf>", "Passat", "CC", "Beetle", "Ford", "Chevy", "Nissan"] 
let labelsCount = 10 

override func viewDidLoad() { 
    super.viewDidLoad() 
    testTable.delegate = self 
    testTable.reloadData() 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return stringStuff.count 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     let total = ((Int(indexPath.row) + 2) * 2) 


     return CGFloat(total * labelsCount) 
} 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 



func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? cellClass 

    cell?.containerView.subviews.forEach({ $0.removeFromSuperview() }) 


    cell?.addViews(indexPath.row + 1) 

    return cell! 
} 


} 

enter image description here

+0

Ich bin mehr neugierig wie ich die Etiketten dynamisch erstellen? Ich kann nicht einfach das Label zu der Zelle im Storyboard hinzufügen, da ich zum Beispiel zwei Labels in einer Zelle und 8 in der anderen benötige. – Recusiwe

+0

Erstellen Sie eine Funktion in Ihrer benutzerdefinierten Zellklasse, um eine Anzahl von Labels zu generieren.Führen Sie dann einfach einen Code wie diesen in einer for-Schleife aus 'var label = UILabel (Rahmen: CGRectMake (0, Nummer, 200, 21)) label.center = CGPointMake (160, 284) label.textAlignment = NSTextAlignment.Center label.text = "Ich bin ein Testetikett" self.view.addSubview (label) ' – Haligen

+0

Ich werde es versuchen! Aber ich muss n Anzahl der Etiketten nach der Anzahl bestimmter Daten erstellen, die ich vom JSON bekomme, wie kann ich das bekommen, wenn ich die Etiketten in meiner benutzerdefinierten Zellklasse anlege? – Recusiwe

0

In heightForRowAtIndexPath, untersuchen Ihre JSON für diese indexPath und Abbildung für diese Zelle die erforderliche Höhe aus. In der Tabellenansicht wird dann die Zeile so angepasst, dass sie Ihrem dynamischen Inhalt entspricht.

Here is a link to the docs

1

sollten Sie nicht die view1 Höhe aktualisieren, nachdem Sie Ihre UILabel erhöhen, versuchen Sie dies:

func addViews() { 
    let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90) 
    containerView.backgroundColor = UIColor.lightGrayColor() 



    let view1 = UIView(frame: rect) 
    view1.layer.shadowColor = UIColor.blackColor().CGColor 
    view1.layer.masksToBounds = false 
    view1.layer.shadowOpacity = 0.2 
    view1.layer.shadowOffset = CGSizeMake(-1, 1) 
    view1.layer.cornerRadius = 2 
    view1.backgroundColor = UIColor.whiteColor() 
    var containerViewHeight = 0 // height for view1 
    var x = 2 as CGFloat 
    var y = 2 as CGFloat 
    var position = CGPointMake(x, y) 

    i in 1...5 { 
     let recti = CGRect(x: x, y: y, width: 50, height: 50) 
     let s = UILabel(frame: recti) 
     s.text = "\(i)" 
     y = y + 20 
     view1.addSubview(s) 
     containerViewHeight += 50 //your label height 
     print(i) 
    } 
    view1.bounds.size.height = CGFloat(containerViewHeight) // set height 
    containerView.addSubview(view1) 
} 
0

UITableViewAutomaticDimension verwendet, wenn Sie Ihre UITableViewCell mit Auto-Layout festgelegt haben. und du hast keine gesetzt.

Sie haben zwei verschiedene Möglichkeiten, dies zu erreichen:

Handle It In-Code

Sie wissen, wie viel Höhe ein Etikett braucht, so in rowForHeightAtIndexPath Rückkehr expectedHeightForOneLabel * numberOfLabels

StackView + Autol- Layout

Wenn Sie für iOS 9.0+ entwickeln, verwenden Sie UIStackView mit stackView.axis = .Vertical, setzen Sie Auto-Layout für Ihre StackView und setzen Sie stackView.distribution = .FillProportionally, Dann beginnen Sie Etiketten hinzufügen.