如何在UITableViewCell

时间:2015-11-17 08:47:59

标签: ios swift uitableview uicollectionview

我想在我Label的{​​{1}}内创建一个具有固定宽度和高度的UITableViewCell个框的网格。怎么办呢?

我想要这个:

enter image description here

我明白了:

enter image description here

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

  • 根据有多少项目UITableViewCell的高度不会动态变化
  • 项目之间的空间无法准确设置(因为您只能定义minCellSpacing值)

我的问题:

创建此Label网格的最佳方法是UITableViewCell的高度将根据项目数量动态变化,因此我可以准确设置项目之间的间距?

(如果可以在没有UICollectionView的情况下完成,那将是不错的,但不是必需的)

3 个答案:

答案 0 :(得分:1)

如果您的目标是iOS 9,则可以通过向您的单元格添加UIStackView s集合来实现此目的。外部堆栈视图将是垂直的,并且每行将是水平堆栈视图。您可以使用FillEqually进行分发,以确保所有单元格的宽度相同。

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

Cell Grid Example

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

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

enter image description here

它使用8像素的默认间距,但您可以通过spacingLMColumnView的{​​{1}}属性进行更改。

答案 2 :(得分:0)

你可以在Uitableview Cell中添加Uicollection View .....否则你需要计算你想要在每个单元格中添加的no.of框的Uitableview单元格的高度...但我觉得collectionview更好实现这一目标的方法我可以知道为什么你不想使用uicollection视图......