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中的大小而不是表视图的大小来计算的。因此,我假设有些单元格看起来太高,以适应换行,即使标签实际上不需要在表视图中换行。有什么想法吗?