我想在我Label
的{{1}}内创建一个具有固定宽度和高度的UITableViewCell
个框的网格。怎么办呢?
我想要这个:
我明白了:
我尝试在UICollectionView
中使用UITableViewCell
,但我遇到了两个问题:
UITableViewCell
的高度不会动态变化我的问题:
创建此Label
网格的最佳方法是UITableViewCell
的高度将根据项目数量动态变化,因此我可以准确设置项目之间的间距?
(如果可以在没有UICollectionView
的情况下完成,那将是不错的,但不是必需的)
答案 0 :(得分:1)
如果您的目标是iOS 9,则可以通过向您的单元格添加UIStackView
s集合来实现此目的。外部堆栈视图将是垂直的,并且每行将是水平堆栈视图。您可以使用FillEqually
进行分发,以确保所有单元格的宽度相同。
或者,您可以考虑使用支持iOS 8的MarkupKit框架中的LMColumnView
和LMRowView
。以下是一个示例:
视图控制器的源代码如下所示:
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)
}
}
基本上,它会生成一个随机数来表示每个单元格中的标签数量,然后根据填充单元格的需要创建尽可能多的行和标签。创建空标签以确保所有内容对齐。
答案 1 :(得分:1)
以下是initWithStyle:reuseIdentifier:
方法的更新版本,可确保标签为30x30:
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像素的默认间距,但您可以通过spacing
和LMColumnView
的{{1}}属性进行更改。
答案 2 :(得分:0)
你可以在Uitableview Cell中添加Uicollection View .....否则你需要计算你想要在每个单元格中添加的no.of框的Uitableview单元格的高度...但我觉得collectionview更好实现这一目标的方法我可以知道为什么你不想使用uicollection视图......