UITableViewCell中的UIStackView和多行标签

UITableViewCell中的UIStackView和多行标签,uitableview,autolayout,uilabel,ios9,uistackview,Uitableview,Autolayout,Uilabel,Ios9,Uistackview,我想要一个自定义的UITableViewCell,其中包含许多垂直堆叠的UILabels,所有这些都可以包含包装多行的文本。有了iOS9中新的UIStackView,以及单元自调整大小机制,我认为这很简单,但我无法让它工作。我使用的是Xcode 7beta3 我创建了一个简单的测试应用程序。这是IB中的设置: UIStackView与UIStackViewDistribution.Fill和UIStackViewAlignment.Fill垂直,但我基本上尝试了所有组合,但都没有成功 UIL

我想要一个自定义的
UITableViewCell
,其中包含许多垂直堆叠的
UILabel
s,所有这些都可以包含包装多行的文本。有了iOS9中新的
UIStackView
,以及单元自调整大小机制,我认为这很简单,但我无法让它工作。我使用的是Xcode 7beta3

我创建了一个简单的测试应用程序。这是IB中的设置:

UIStackView
UIStackViewDistribution.Fill
UIStackViewAlignment.Fill
垂直,但我基本上尝试了所有组合,但都没有成功

UILabel
s具有
numberOfLines=0
lineBreakMode=.ByWordWrapping

守则:

class Cell: UITableViewCell {

    @IBOutlet var label1: UILabel!
    @IBOutlet var label2: UILabel!
}

class MasterViewController: UITableViewController {

    struct Data {
        let label1: String
        let label2: String
    }

    var objects = [Data]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 60

        createData()
    }

    private func createData() {

        for ii in 0 ..< 20 {

            let data = Data(label1: "\(ii): hello world this is a longer string that should wrap without going weird", label2: "label2 has lots of writing as well and so should wrap onto multiple lines")
            objects.append(data)
        }
    }

    // MARK: - Table View

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

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

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

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell
        let data = objects[indexPath.row]

        cell.label1?.text = data.label1
        cell.label2?.text = data.label2

        return cell
    }
}
类单元格:UITableViewCell{
@IBVAR标签1:UILabel!
@IBVAR标签2:UILabel!
}
类MasterViewController:UITableViewController{
结构数据{
让label1:字符串
让label2:字符串
}
变量对象=[数据]()
重写func viewDidLoad(){
super.viewDidLoad()
tableView.rowHeight=UITableViewAutomaticDimension
tableView.estimatedRowHeight=60
createData()
}
私有函数createData(){
对于0..<20中的ii{
让data=data(label1:\(ii):hello world这是一个较长的字符串,应该不会变得奇怪”,label2:“label2也有很多书写,因此应该换行到多行上”)
objects.append(数据)
}
}
//标记:-表视图
重写func numberOfSectionsInTableView(tableView:UITableView)->Int{
返回1
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回objects.count
}
重写func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(“cell”,forIndexPath:indexPath)作为!cell
让data=objects[indexPath.row]
cell.label1?.text=data.label1
cell.label2?.text=data.label2
返回单元
}
}
我想知道测试版中是否有bug,因为有时候一个标签会被包装,而另一个则不会

例如,我尝试将
UIStackView
嵌套在另一个
UIStackView
中,如下所示:

我根本没有修改代码。现在,一个标签包裹,而另一个不包裹:


任何帮助都将不胜感激

问题是在单元格初始化时,默认情况下单元格的宽度为600,因此它将根据600宽度计算行的高度。这是因为单元是在具有大小类的故事板中创建的


我认为这将是一个错误的测试版,作为一个解决方案,采取你的细胞在锡伯,然后使用。它会很好用。

是的,它修好了。非常感谢你。与此测试项目相比,我在实际项目中仍然遇到问题,但这肯定是其他原因,我仍在调查。经过更多调查,NIB中的
UITableViewCell
的大小似乎已被用于自行调整大小。电池永远不会比笔尖中的电池小,而是更大,以便包装标签。但是,换行是基于NIB中的大小而不是表视图的大小来计算的。因此,我假设有些单元格看起来太高,以适应换行,即使标签实际上不需要在表视图中换行。有什么想法吗?