如何在UITableViewCell中创build具有dynamic高度的视图网格

我想创build一个盒子的网格,这是在我的UITableViewCell具有固定宽度和高度的Label 。 如何才能做到这一点?

我要这个:

在这里输入图像说明

我得到这个:

在这里输入图像说明

我尝试在UITableViewCell使用UICollectionView ,但我遇到了两个问题:

  • UITableViewCell的高度不会根据有多less项目而dynamic改变
  • 项目之间的空间不能准确设置(因为你只能定义一个minCellSpacing值)

我的问题:

什么是最好的方式来创build这个Label的网格,使UITableViewCell的高度会根据项目的数量dynamic变化,所以我可以准确地设置项目之间的间距?

(如果没有UICollectionView ,这可以很好,但它不是一个要求)

以下是initWithStyle:reuseIdentifier:的更新版本initWithStyle:reuseIdentifier:确保标签为30×30的方法:

 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) let count = 16 + Int(arc4random_uniform(16)) print(count) let rows = Int(ceil(Double(count) / Double(ColumnCount))) let columnView = LMColumnView() for var i = 0; i < rows; i++ { let rowView = LMRowView() rowView.height = 30 columnView.addArrangedSubview(rowView) for var j = 0; j < ColumnCount; j++ { let number = Int(arc4random_uniform(150)) let label = UILabel() if (i * ColumnCount + j < count) { label.text = String(number) label.width = 30 label.textAlignment = NSTextAlignment.Center label.backgroundColor = UIColor.greenColor() } rowView.addArrangedSubview(label) } rowView.addArrangedSubview(LMSpacer()) } appendMarkupElementView(columnView) } 

在这里输入图像说明

它使用8像素的默认间距,但是可以通过LMColumnViewLMRowViewspacing属性来LMRowView

如果你的目标是iOS 9,你可以通过向你的单元添加一个UIStackView的集合。 外部堆栈视图将是垂直的,每一行将是一个水平堆栈视图。 您可以使用FillEqually进行分配,以确保所有单元格的宽度相同。

或者,您可以考虑使用支持iOS 8的MarkupKit框架中的LMColumnViewLMRowView 。下面是一个示例:

单元网格示例

视图控制器的源代码如下所示:

 import UIKit class ViewController: UITableViewController { let GridCellIdentifier = "gridCell" override func viewDidLoad() { super.viewDidLoad() tableView.registerClass(GridCell.self, forCellReuseIdentifier: GridCellIdentifier) tableView.estimatedRowHeight = 2; } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1; } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 6; } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return tableView.dequeueReusableCellWithIdentifier(GridCellIdentifier)! } } 

单元格代码如下所示:

 import UIKit import MarkupKit class GridCell: LMTableViewCell { let ColumnCount = 7 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) let count = 16 + Int(arc4random_uniform(16)) let rows = Int(ceil(Double(count) / Double(ColumnCount))) let columnView = LMColumnView() for var i = 0; i < rows; i++ { let rowView = LMRowView() rowView.height = 40 columnView.addArrangedSubview(rowView) for var j = 0; j < ColumnCount; j++ { let number = Int(arc4random_uniform(150)) let label = UILabel() if (i * ColumnCount + j < count) { label.text = String(number) label.textAlignment = NSTextAlignment.Center label.backgroundColor = UIColor.greenColor() } label.weight = 1.0 rowView.addArrangedSubview(label) } } appendMarkupElementView(columnView) } required init?(coder decoder: NSCoder) { super.init(coder: decoder) } } 

基本上,它会生成一个随机数来表示每个单元格中的标签数量,然后创build尽可能多的行和标签来填充单元格。 空标签创build,以确保一切alignment。

你可以在Uitableview Cell本身中添加Uicollection View …..否则你将需要计算你的Uitableview单元格的高度,以便在每个单元格中添加no.of框…但是我认为collectionview是更好的实现方法这可以知道你为什么不想使用uicollection查看…