2015-07-05 7 views
8

edit # 1

dodałem link do projektu na github tutaj: https://github.com/trestles/testtableUILabel nie robi multline w niestandardowych UITableViewCell na rozpoczęcie ale nie po przewijane-back

To jest naprawdę moja pierwsza czas zajmować się Auolayout, więc spodziewam się, że popełniam kilka błędów amatorskich. Szczerze mówiąc, wiem, jak robiłbym te manipulujące klatki, ale nie mogę poprawnie pracować z autolayout z przycinaniem zawartości. Część pytań brzmi: czy powinienem używać ramek, jeśli zawsze jesteśmy w trybie portretu?


Mam niestandardowy UITableViewCell, gdzie mam kilka UILabel. Są ustawione na numberOfLines = 0. Czasami skracają tekst. Tak:

enter image description here

Jak mogę rozwiązać ten problem? Próbowałem ponownie załadowaćData w viewDidLoad, ale nie wydaje się to ważne. Najczęściej, gdy się przewijasz, poprawia się (ale nie zawsze). Mogą to być dowolne trzy z UILabeli i są niezależne od ilości tekstu. Mój pierwszy raz korzystam z UILabels z Auto Layout, więc najprawdopodobniej popełniłem jakiś błąd. Oto co moje właściwości UILabel są:

enter image description here

i układ dla pierwszej etykiety:

enter image description here

+0

czy dodałeś "\ n", aby oznaczyć koniec linii – jdl

+0

, rozumiem, że powinno się zawijać, a \ n jest niepotrzebne. Ustawiłem szerokość za pomocą ograniczenia. Wykonałem kilka razy używając ręcznych ramek, a multiLine jest zwykle włączane poprzez ustawienie numberOfLines = 0 – timpone

+0

wkleić tutaj kod. –

Odpowiedz

3

Twój automatyczny układ jest idealny, tylko problem wystąpił z powodu ustawiania auto layout z domyślnego tekstu w XIb. i w tobie viewDidLoad, gdzie aktualizujesz programowo tekst UILabel, ale nie aktualizujesz layout. więc pozostała tylko jedna linia, jak poniżej.

self.mainTV.layoutIfNeeded(); 

Dodaj powyżej linii przed przeładować UITableView w viewDidLoad metody. wszystko działa dobrze.

Przykład:

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. 
    } 

Nadzieja to pomóc.

+0

@timpone, daj mi znać, jeśli nadal masz problem. –

2

Aktualizacja ograniczenie komórek i układ

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

Pobrałem źródło z git. Nie jestem pewien, czy to błąd, czy nie. Ale ponowne załadowanie tabeli w viewdidappear rozwiązało problem.

override func viewDidAppear(animated: Bool) { 

     mainTV.reloadData() 

    } 

Tak właśnie będzie wyglądał na symulatorze podczas wykonywania powyższej czynności. enter image description here

0

Widzę, że ustawiłeś ograniczenie tylko w wysokości, bez szerokości. Spróbuj również ustawić.

Powiązane problemy