UIStackView and multi-line labels in a UITableViewCell

I want to have a custom UITableViewCell with the number of vertically arranged UILabel , all of which can contain text that wraps multiple lines. With the new UIStackView in iOS9 and the cell self-tuning mechanism, I thought it would be easy, but I can't get it to work. I am using Xcode 7beta3.

Table view with labels not wrapping

I created a simple test application. This is the setting in IB:

IB setup with prototype cell

UIStackView is vertical with UIStackViewDistribution.Fill and UIStackViewAlignment.Fill , but I basically tried all the combinations without success.

UILabel have numberOfLines = 0 and lineBreakMode = .ByWordWrapping .

The code:

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

I wonder if there is a bug in the beta version, because sometimes one of the tags is wrapped, and the other is not.

For example, I tried to insert a UIStackView into another UIStackView as follows:

Nested UIStackView in IB

I have not made any code changes. Now one shortcut is wrapped, and the other is not:

One label wrapping only

Any help would be greatly appreciated!

+5
source share
1 answer

The problem is during the initialization of the cell, by default the width of the cell will be 600, so it will calculate the row height based on the width of 600. This is because the cell is created in a storyboard with size classes.

I think this will be a bug in the beta, and as a solution to this, take your cell in xib and then use. It will work fine.

+3
source

All Articles