UITableView的动态高度(非单元格)

时间:2016-11-24 04:42:34

标签: ios swift uitableview

我正在尝试使用UITableView列出用户可用的所有不同HomeKit设备。

显然,没有办法知道他们有多少设备,所以我需要在故事板中更改UITableView's高度。

我试过这个,我在viewDidLoad()函数中调用:

func adjustHeightOfTableView() {

  //getting the height of the tableview
    var tableHeight = self.tableView.contentSize.height

   //the height of the content inside the view
    var maxHeight = self.tableView.superview?.frame.size.height


    //if the height of the content is bigger then the height of the tableview
    if (maxHeight! > tableHeight) {

        tableHeight = maxHeight!
        //set the tableview height to be the content height

    }

    //trying to reload the tableview height?
    self.view.layoutIfNeeded()
    self.tableView.reloadData()

}

我试图在tableview下面有一些UI元素,我希望它们是tableview底部的一个空间,但是tableview也是它需要的高度,对于任何数量的单元格有。。

但它只是不起作用。 如果我做错了什么,或者有人知道如何做这项工作,请告诉我。 谢谢!

4 个答案:

答案 0 :(得分:2)

注意:对于这种方法,您需要具有静态单元格高度或找出一种方法来了解总内容高度

假设您正在使用约束,请在UITableView上创建以下约束(除了前导和尾随!)

向您的超级视图添加优先级为750且底部间距约束为0的高度约束,该超级视图将为>= 0且优先级为1000.为您在此处创建的此高度约束创建出口UIViewController

现在,

func adjustHeightOfTableView() {

  //set the height to be equal to the number of elements multiplied by the height of each cell. 
 //or use some logic that allows you to know what content size or space the cells will occupy!
  tableViewHeightConstraint.constant = dataArray.count * rowHeight    

  view.layoutIfNeeded()
}

现在,如果你的UITableView身高低于超级视野,那么没问题!但是如果它大于屏幕边界,它将打破高度约束并变为全屏并正常显示内容,正如您期望UITableView一样!

修改: 即使您使用的是UIAutomaticRowDimensions,您可以通过编程方式向UITableView添加约束。即

当然,您的所有其他观点仍然会对您的UITableView产生最低限制。 在故事板中创建UITableView,在超级视图中使用正常的前导,尾随,顶部和底部。获取数据。获取UITableView的contentSize,然后删除底部约束。现在添加一个高度约束,该约束将是UIScreen.main().bounds.size.heightcontentSize的最小值。

答案 1 :(得分:1)

如果您使用自动布局

,则可以使用自动尺寸

在视图中执行:

let nib = UINib(nibName: "YOURCELLNIB", bundle: nil)
      tableView.registerNib(nib, forCellReuseIdentifier: "REUSEIDENTIFIER")
      tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140

删除功能

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath)

答案 2 :(得分:0)

在您的代码中,您有:

    tableHeight = maxHeight!
    //set the tableview height to be the content height

但这不会改变表高度 - 它只会更改以前分配了旧表内容高度值的某个变量。你的代码中没有任何地方可以做任何改变表高度的事情。

直接更改表格高度的一种方法是为其指定一个全新的框架,其中包含旧框架的值,但框架的高度除外,您可以根据自己的喜好计算它。

尝试这样的事情(添加你需要的其他逻辑):

oldFrame = self.tableView.frame
newHeight = rowCount * rowHeight
self.tableView.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, oldFrame.size.width, newHeight)

答案 3 :(得分:0)

有一种解决方法可以使高度看起来像根据细胞数量而变化。

  1. 在init时将tableview height设置为适当的值。

    UITableView.init(frame: CGRect.init(x: 0, y: 70, width: self.view.frame.width, height: self.view.frame.height - 350))
    
  2. 将tableview背景颜色设置为白色透明。

    pulldownTableView?.backgroundColor = UIColor.white.withAlphaComponent(0)
    
  3. 设置tableFooterView。

    pulldownTableView?.tableFooterView = UIView(frame: CGRect.zero)
    
  4. 下面是结果,img中有两个表。我为前面的tableview设置透明,左边img将backgroundColor设置为白色,右边白色透明。

    background not transparent ---------------------- vs ---------------- {{3 }}