2016-04-13 201 views
9

我想有一個類似的行爲,而不是<Table>HTML標記,在這個意義上,幀的大小根據其內容。如何根據其內容調整UIStackView的大小?

在我的上下文中,我使用UIStackView作爲UITableViewCell的內容視圖。由於單元格中的項目是各種信息,因此單元格的高度應該是可變的。

我的策略就是以編程方式生成的細胞作爲具有.Vertical軸UIStackView,如代碼片段如下:

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 
} 

不幸的是,細胞大小不調整的內容,並作爲結果我必須自己設置單元格高度,如下所示:

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

我該如何解決這個問題?

+1

我想你應該正確地對這種方法的工作單元約束你stackView。 – zcui93

+1

我已經測試了這條路徑(在單元中添加了sv T-T,L-L,R-R,B-B約束),但是這會導致超寬單元(一次只能看到一個單元)。 @ zcui93 –

+0

自己的StackView應該受到單元的約束,所以單元會隨之增長。然後設置子視圖,以便StackView根據其「內部內容大小」正確增長 – zcui93

回答

0

UIStackView的設計目的是根據內容來增加其尺寸。爲了使其工作,您需要設置UIStackViewUITableViewCell之間的約束條件。例如,這是制約​​看怎麼樣在Interface Builder:

enter image description here enter image description here

如果你喜歡設置代碼的限制,應該工作了。

爲了證明這會起作用,我使用了cellForRowAt函數。基本上,它將UILabel放在UIStackView的內部,標籤計數取決於行號。

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 
} 

下面是最終的結果:

https://github.com/yzhong52/AutosizeStackview

相關問題