2015-07-05 3 views
8

bearbeiten # 1

ich einen Link zu dem Projekt auf GitHub hier hinzugefügt: https://github.com/trestles/testtableUILabel macht multline nicht in einem benutzerdefinierten UITableViewCell beim Start aber nicht nach gescrollt-zurück

Das ist wirklich meine erste ist Zeit mit Auolayout zu tun, also erwarte ich, dass ich ein paar Amateurfehler mache. Ehrlich gesagt, weiß ich, wie ich das tun würde, Frames zu manipulieren, aber nicht mit dem automatischen Layout mit dem Clipping des Inhalts richtig arbeiten kann. Ein Teil der Fragen ist, sollte ich nur Frames verwenden, wenn wir immer im Portrait-Modus sind?


Ich habe eine benutzerdefinierte UITableViewCell, wo ich ein paar UILabels habe. Sie sind auf numberOfLines = 0 festgelegt. Manchmal werden sie den Text abschneiden. Wie folgt aus:

enter image description here

Wie behebe ich das? Ich habe versucht, Daten in ViewDidLoad neu zu laden, aber das schien nicht von Bedeutung zu sein. Meistens, wenn Sie scrollen, repariert es sich selbst (aber nicht immer). Es kann sich um drei beliebige UILabels handeln und ist unabhängig von der Textmenge. Mein erstes Mal benutze ich UILabels mit Auto Layout, also wahrscheinlich einen Fehler, den ich gemacht habe. Hier ist, was meine UILabel Eigenschaften sind:

enter image description here

und das Layout für das erste Label:

enter image description here

+0

haben Sie '\ n' hinzugefügt, um das Ende der Zeile – jdl

+0

zu markieren, ist mein Verständnis, dass es umbrechen sollte und dass a \ n nicht notwendig ist. Ich habe die Breite über eine Einschränkung festgelegt. Ich habe eine Reihe von Malen mit manuellen Frames und MultiLine ist in der Regel aktiviert über die Einstellung NummerOfLines = 0 – timpone

+0

Code hier einfügen. –

Antwort

3

Ihr Auto Layout ist perfekt, nur Problem trat auf, weil Sie auto layout mit Standardtext in Ihrem xib setzen. und in dir viewDidLoad, wo Sie UILabel Text aktualisieren, aber nicht layout programmatisch aktualisieren. so bleibt nur eine Zeile übrig wie unten.

self.mainTV.layoutIfNeeded(); 

über die Linie hinzufügen, bevor UITableView in viewDidLoad Verfahren neu zu laden. all die Dinge funktionieren gut.

Beispiel:

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.mainTV.dataSource=self 
    self.mainTV.delegate=self 
    self.mainTV.rowHeight = UITableViewAutomaticDimension 
    self.mainTV.estimatedRowHeight = 84.0 
    //self.mainTV.registerClass(MyTableViewCell.self, forCellReuseIdentifier: "MyCustomCell") 


    var tmps = [String]() 

    tmps.append("ABC But here is an artist. He desires to paint you the dreamiest, shadiest, quietest, most enchanting bit of romantic landscape in all the valley of the Saco. What is the chief element he employs?") 
    tmps.append("DEF But here is an artist.") 
    tmps.append("GHI But here is an artist. He desires to paint you the dreamiest, shadiest, quietest, most enchanting bit") 

    for var i=0; i<10; i++ 
    { 
     var menuItem=EKMenuItem() 
     let randomIndex1 = Int(arc4random_uniform(UInt32(tmps.count))) 
     menuItem.header = "\(i) \(tmps[randomIndex1])" 

     let randomIndex2 = Int(arc4random_uniform(UInt32(tmps.count))) 
     menuItem.detail = "\(i) \(tmps[randomIndex2])" 
     let randomIndex3 = Int(arc4random_uniform(UInt32(tmps.count))) 
     menuItem.price = "\(i) \(tmps[randomIndex3])" 
     //tmpItem.price = "my price" 
     dataItems.append(menuItem) 
    } 

    self.view.backgroundColor = UIColor.greenColor() 

    self.mainTV.layoutIfNeeded(); 
    self.mainTV.reloadData() 
    // Do any additional setup after loading the view, typically from a nib. 
    } 

Hoffnung diese Ihnen helfen.

+0

@timpone, lassen Sie mich wissen, wenn Sie immer noch Probleme haben. –

2

Update Ihr Handy Einschränkung und das Layout

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

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCustomCell") as! MyTableViewCell 
    cell.headerLabel.text=dataItems[indexPath.row].header 
    cell.setHeader(dataItems[indexPath.row].header) 
    cell.setDetail(dataItems[indexPath.row].detail) 
    cell.setPrice(dataItems[indexPath.row].price) 
    // update constraint and layout 
    cell.layoutIfNeeded() 
    return cell 
    } 
2

Ich habe die Quelle von git heruntergeladen. Ich bin mir nicht sicher, ob das ein Bug ist oder nicht. Aber das erneute Laden der Tabelle in ViewDidAppear löste das Problem.

override func viewDidAppear(animated: Bool) { 

     mainTV.reloadData() 

    } 

So wird es auf dem Simulator aussehen, wenn Sie den obigen Vorgang ausführen. enter image description here

0

Ich sehe Sie Beschränkung nur in der Höhe, keine Breite. Versuchen Sie es auch einzustellen.

Verwandte Themen