动态设置tableview高度并限制一些扩展swift 3?

时间:2017-07-03 10:54:48

标签: ios uitableview uiview swift3

我有一个表视图作为popUpTableView,因为我需要动态设置表视图高度,而不是行数。 我正在添加cellForRowAtIndexpath

  popupTableView.height = popupTableView.contentSize.height

它工作正常,但问题是当没有细胞增加时,tableview高度增加而不是其原始高度

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高度以及放置该代码的位置?

先谢谢。

4 个答案:

答案 0 :(得分:1)

在popuptableview的viewdidLoad()中使用此功能:

popupTableView.estimatedRowHeight = 120

并创建一个设置自动尺寸高度的函数:

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

答案 1 :(得分:0)

要使UITableViewCell返回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
            }
        }

在这种情况下,请不要忘记使用自动布局,有关详细信息See Here

答案 2 :(得分:0)

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

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

  if changeHeight < maxHeight {
  popupTableView.height = changeHeight
  }
}

答案 3 :(得分:0)

取一个变量来计算tableview的底部约束值

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

调用委托方法willDisplay:of tableview

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