2016-04-13 27 views
9

Chciałbym mieć podobne zachowanie niż znacznik HTML <Table>, w tym sensie, w którym rozmiar ramki jest zgodny z jej zawartością.Jak zmierzyć UIStackView w zależności od jego zawartości?

W moim kontekście używam UIStackView jako widoku zawartości UITableViewCell. Ponieważ elementy w komórce są różnymi informacjami, wynikowa wysokość komórki powinna być zmienna.

Moja strategia jest programowo zbudować komórkę jako UIStackView z osią .Vertical, jak we fragmencie kodu, co następuje:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    let sv = UIStackView(frame: tableview.frame) 
    sv.axis = .Vertical 
    cell.addSubview(sv) 
    for i in information { 
     let l = UILabel() 
     l.text = i 
     sv.addSubViewAndArrange(l) 
    } 

    return cell 
} 

Niestety, wielkość komórek nie dostosuje się do treści, jak i wynik muszę ustawić wysokość komórki w następujący sposób:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return cellHeight  // a constant 
} 

Jak mogę to naprawić?

+1

myślę, że należy właściwie ograniczeniem swój stackView z komórką dla tego podejścia do pracy. – zcui93

+1

Przetestowałem już tę ścieżkę (dodałem do komórki komórki sv T-T, L-L, R-R, B-B), ale w rezultacie powstaje ultra szeroka komórka (ledwo widzisz tylko jedną komórkę na raz). @ Zcui93 –

+0

StackView na własną rękę powinien być ograniczony komórką, aby komórka rosła wraz z nim. Następnie konfigurujesz subviews, aby StackView rozwijał się prawidłowo w oparciu o ich "Intrinsic Content Size" – zcui93

Odpowiedz

0

UIStackView został zaprojektowany w celu powiększenia jego rozmiaru zgodnie z zawartością. Aby to zadziałało, musisz ustawić ograniczenia między UIStackView i UITableViewCell. Na przykład, jest to, w jaki sposób ograniczenia wyglądać w interfejsie konstruktora:

enter image description here enter image description here

Jeśli podoba Ci się ustanowienie ograniczeń w kodzie, który powinien działać zbyt.

Aby zademonstrować, że to zadziała, mam to dla funkcji cellForRowAt. Zasadniczo, umieszcza liczbę UILabel wewnątrz UIStackView, a liczba etykiet zależy od numeru wiersza.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableviewCell", for: indexPath) as! TableviewCell 
    for i in 1...indexPath.row + 1 { 
     let label = UILabel() 
     label.text = "Row \(indexPath.row), Label \(i)" 
     cell.stackView.addArrangedSubview(label) 
    } 
    return cell 
} 

Oto efekt końcowy:

https://github.com/yzhong52/AutosizeStackview