dynamic设置tableview的高度并将其限制在一定范围内swift 3?

我有一个表视图作为popUpTableView,因为我需要设置表视图高度为每行的dynamic。 我正在joincellForRowAtIndexpath

popupTableView.height = popupTableView.contentSize.height 

它工作正常,但问题是当没有单元格增加,然后桌面高度增加比它的原始高度

 extension DiagnosisViewController :UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == diagnosisTableView { return self.diagnosisModel.count } else if tableView == popupTableView { return self.popupDiagnosisModel.count } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell:DiagnosisTableViewCell? if tableView == self.diagnosisTableView { cell = self.diagnosisTableView.dequeueReusableCell(withIdentifier: "DiagnosisCell") as? DiagnosisTableViewCell if diagnosisModel.count > 0 { let model = diagnosisModel[indexPath.row] cell?.indexLabel.text = String(indexPath.row + 1) cell?.diagnosisNameLabel.text = " \(model.diagnosisDescription!)" cell?.deleteButton.tag = indexPath.row cell?.deleteButton.addTarget(self, action:#selector(deleteDiagnosis(button:)), for: .touchUpInside) diagnosisNotFoundLabel.isHidden = true } } else if tableView == self.popupTableView { cell = self.diagnosisTableView.dequeueReusableCell(withIdentifier: "DiagnosisCell") as? DiagnosisTableViewCell cell?.deleteButton.isHidden = true if (indexPath.row % 2 == 0) { cell?.baseView.backgroundColor = UIColor.white } else { cell?.baseView.backgroundColor = UIColor.init(colorLiteralRed: 241/255, green: 241/255, blue: 241/255, alpha: 1.0) } cell?.indexLabel.text = String(indexPath.row + 1) cell?.indexView.layer.cornerRadius = (cell?.indexView.frame.size.width)!/2 cell?.indexView.layer.borderWidth = 0.5 cell?.indexView.layer.borderColor = UIColor.lightGray.cgColor cell?.baseView.layer.borderWidth = 0.5 cell?.baseView.layer.cornerRadius = 5.0 cell?.baseView.layer.borderColor = UIColor.lightGray.cgColor; if diagnosisModel.count > 0 { let model = popupDiagnosisModel[indexPath.row] cell?.diagnosisNameLabel.text = " \(model.diagnosisDescription!)" } self.popupTableView.height = self.popupTableView.contentSize.height } return cell! } } let maxHeight = popupTableView.frame.size.height let changeHeight = popupTableView.contentSize.height if changeHeight < maxHeight { popupTableView.height = changeHeight } 

如何获取仅可见单元格的tableview高度以及放置该代码的位置?

提前致谢。

viewdidLoad()中使用它:

popupTableView.estimatedRowHeight = 120

并创build自动尺寸的高度设置function:

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

获取UITableViewCelldynamic高度返回UITableViewAutomaticDimension作为行高。

例子:(在我的情况下)

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.row == 0 { return 200 } else if indexPath.row == 1 { return 10 } else { return UITableViewAutomaticDimension } } 

在这种情况下,不要忘记使用AutoLayout ,更多信息请看这里

尝试添加代码以调整viewWillLayoutSubviews方法中的高度。 尝试这个

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() let maxHeight = popupTableView.frame.size.height let changeHeight = popupTableView.contentSize.height if changeHeight < maxHeight { popupTableView.height = changeHeight } } 

拿一个variables来计算tableview的bottomconstraint值

  var bottomConstraintValue : CGFloat = 0.0 override func viewDidLoad() { super.viewDidLoad() bottomConstraintValue = self.popupContainerView.height - self.popupTableView.frame.origin.y - self.popupTableView.frame.size.height } 

调用tableview的委托方法willDisplay:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if tableView == popupTableView { if indexPath.row == (popupTableView.indexPathsForVisibleRows?.last)?.row { adjustTableViewHieght(popupTableView: self.popupTableView,popupContainerView: self.popupContainerView , bottomConstraintValue: self.bottomConstraintValue) } } } func adjustTableViewHieght(popupTableView: UITableView,popupContainerView: UIView , bottomConstraintValue:CGFloat){ let contentSizeHeight = popupTableView.contentSize.height; let tableViewHieghtWithBottomSpace = popupContainerView.height - popupTableView.frame.origin.y let actualTableViewHieght = (tableViewHieghtWithBottomSpace - bottomConstraintValue) if (contentSizeHeight > actualTableViewHieght) { popupTableView.height = actualTableViewHieght } else { popupTableView.height = contentSizeHeight } }