高度是否适应TableView单元格中的内容?

时间:2016-06-16 22:31:01

标签: swift tableview cell

我对Swift很新,我偶然发现了一个问题。我获取一些JSON数据并在TableView中显示它,但问题是每个单元格之间可以有n个标签(来自JSON(因此单元格需要具有不同数量的内容。我如何实现这一点) ?

编辑:我无法真正开始工作,我这样做是为了在创建tableview时添加更多标签。在我的自定义单元格中。

func addViews() {
     let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90)
     containerView.backgroundColor = UIColor.lightGrayColor()

     let view1 = UIView(frame: rect)
     view1.layer.shadowColor = UIColor.blackColor().CGColor
     view1.layer.masksToBounds = false
     view1.layer.shadowOpacity = 0.2
     view1.layer.shadowOffset = CGSizeMake(-1, 1)
     view1.layer.cornerRadius = 2
     view1.backgroundColor = UIColor.whiteColor()

     var x = 2 as CGFloat
     var y = 2 as CGFloat
     var position = CGPointMake(x, y)
     i in 1...5 {
         let recti = CGRect(x: x, y: y, width: 50, height: 50)
         let s = UILabel(frame: recti)
         s.text = "\(i)"
         y = y + 20
         view1.addSubview(s)
         print(i)
     }
     containerView.addSubview(view1)  
}

我已将这两行添加到我的TableViewController

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100

但它不会调整,只会在关闭单元格之前显示第一个标签。

4 个答案:

答案 0 :(得分:3)

在自定义单元格类中设置标签,然后使用&autorotate=true 向其发送数据。

cellForRow

enter image description here

这可能是一个巨大的黑客攻击,我确信有更好的方法,但这里有一些功能代码可以在不使用自动布局或预定义标签的情况下动态调整行的大小。您可能需要使用rect高度来使所有内容看起来正确,并且cellForRowAtIndexPath中的remove子视图是细胞重用所必需的。

import UIKit


class cellClass: UITableViewCell {


@IBOutlet weak var containerView: UIView!


func addViews(jsonStuff: [String]){

    let rect = CGRect(x: 0, y: 0, width: 100, height: 20)
    var x = 50 as CGFloat
    let y = 20.0 as CGFloat

    var position = CGPointMake(x, y)

    for str in jsonStuff{

        let label = UILabel(frame: rect)
        label.text = str
        label.center = position
        containerView.addSubview(label)
        x = x + 40
        //y = y + 20
        position = CGPointMake(x,y)

    }


}





}



class ViewController: UIViewController, UITableViewDelegate,       UITableViewDataSource {

@IBOutlet weak var table: UITableView!

var stringStuff = ["this", "that", "tje", "blah", "hey"]


override func viewDidLoad() {
    super.viewDidLoad()

}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return stringStuff.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:  NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as!      cellClass
    if indexPath.row < 2{
        let sub = stringStuff[0...2]
        cell.addViews(Array(sub))
    }else{
        cell.addViews(stringStuff)
    }


    return cell
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

}

enter image description here

答案 1 :(得分:1)

在递增UILabel后不应该更新view1高度,请尝试:

func addViews() {
     let rect = CGRect(x: 6, y: 10, width: containerView.frame.width-12, height: 90)
     containerView.backgroundColor = UIColor.lightGrayColor()



    let view1 = UIView(frame: rect)
     view1.layer.shadowColor = UIColor.blackColor().CGColor
     view1.layer.masksToBounds = false
     view1.layer.shadowOpacity = 0.2
     view1.layer.shadowOffset = CGSizeMake(-1, 1)
     view1.layer.cornerRadius = 2
     view1.backgroundColor = UIColor.whiteColor()
     var containerViewHeight = 0 // height for view1
     var x = 2 as CGFloat
     var y = 2 as CGFloat
     var position = CGPointMake(x, y)

     i in 1...5 {
         let recti = CGRect(x: x, y: y, width: 50, height: 50)
         let s = UILabel(frame: recti)
         s.text = "\(i)"
         y = y + 20
         view1.addSubview(s)
         containerViewHeight += 50 //your label height
         print(i)
     }
     view1.bounds.size.height = CGFloat(containerViewHeight) // set height
     containerView.addSubview(view1)  
}

答案 2 :(得分:0)

heightForRowAtIndexPath中,检查该indexPath的JSON并找出该单元格所需的高度。然后表格视图将调整行的大小以匹配您的动态内容。

Here is a link to the docs

答案 3 :(得分:0)

当您使用自动布局设置UITableViewAutomaticDimension时,会使用

UITableViewCell。而且你没有设置任何。

您有两种通用方法可以实现这一目标:

在代码中处理

您知道一个标签需要多少高度,因此在rowForHeightAtIndexPath返回expectedHeightForOneLabel * numberOfLabels

StackView + Autol-layout

如果您正在为iOS 9.0+开发,请将UIStackViewstackView.axis = .Vertical一起使用,为您的stackView设置自动布局并设置stackView.distribution = .FillProportionally,然后开始添加标签。