【问题标题】:How to create a grid of views with dynamic height in UITableViewCell如何在 UITableViewCell 中创建具有动态高度的视图网格
【发布时间】:2015-11-17 08:47:59
【问题描述】:

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

我想要这个:

我明白了:

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

  • UITableViewCell 的高度不会根据项目的数量动态变化
  • 无法准确设置项目之间的间距(因为您只能定义一个 minCellSpacing 值)

我的问题:

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

(如果没有UICollectionView 也可以做到,那就太好了,但这不是必需的)

【问题讨论】:

    标签: ios swift uitableview uicollectionview


    【解决方案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 像素的默认间距,但您可以通过 LMColumnView 和 LMRowView 的 spacing 属性更改它。

    【讨论】:

    • 这看起来很棒格雷格。最后一件事:列数可以动态填充宽度吗?
    • 是的 - 您只需要编写一些基本逻辑来计算有多少 30 像素宽的标签单元格将适合当前的表格视图单元格宽度。
    【解决方案2】:

    如果您的目标是 iOS 9,您可以通过将 UIStackViews 的集合添加到您的单元格来做到这一点。外部堆栈视图是垂直的,每一行都是水平堆栈视图。您可以使用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)
        }
    }
    

    基本上,它会生成一个随机数来表示每个单元格中的标签数量,然后根据填充单元格的需要创建尽可能多的行和标签。创建空标签以确保所有内容对齐。

    【讨论】:

    • 谢谢格雷格。如何强制每个单元格的宽度和高度为 30x30 pts?
    • 我会用一个例子添加另一个答案。
    【解决方案3】:

    您可以在 Uitableview 单元格本身中添加 Uicollection 视图.....否则,您需要计算 Uitableview 单元格的高度,以计算要在每个单元格中添加的框数...但我认为 collectionview 更好实现这一点的方法我可以知道你为什么不想使用 uicollection 视图...

    【讨论】:

    • 我不介意使用集合视图,但是如何根据项目数设置 TableViewCell 的高度?
    • 由于每个盒子的宽度和高度是固定的,所以你知道盒子之间的间距和屏幕的宽度,这样你就可以计算出数量。盒子将适合特定的宽度然后为。 Ex ypu 有 10 个盒子 50*50 所以假设盒子之间的间距为 10 并让屏幕宽度为 300 然后 50*5=250 并且每个盒子之间的间距 10*5 =50 所以 250+50 =300 和下一行相同....因此 10 个框创建了两条线,因此高度将为 50 +50 + 垂直间距,否则在集合视图中,您可以将集合视图的内容高度设置为 UITable 视图单元格的高度。
    • 好的,很好。一旦我计算了 CollectionViews 的高度,我该如何设置它?
    • 只是 PIN 集合视图(顶部 | 底部 | 前导 | 尾随)来自 UItableview 单元格并在“heightForRowAtIndexPath”中设置 UITableview 单元格的高度,这将自动调整集合视图高度。
    猜你喜欢
    • 2018-05-23
    • 2014-10-19
    • 2019-08-18
    • 2013-09-02
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多