UITableview自动调整行问题Swift IOS?

时间:2017-12-27 08:43:58

标签: ios iphone swift uitableview row-height

我面临一个动态调整UITableView行高的问题。我知道通过使用这种方法我们可以实现

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0; 

但在我的情况下,我使用XIB文件UITableViewCell,我正在为细胞添加阴影。在这种情况下,如何动态添加行高。同时,根据服务器时间我显示和隐藏按钮。所以,任何人都可以建议我如何解决这个问题。这是行索引方法的单元格。

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let identifier = "Custom"
        var cell: PApplyLeaveTableViewCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
        if cell == nil {
            tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
            cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
        }
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        cell.contentView.backgroundColor = UIColor.clear
        var localDic :NSDictionary!
        localDic = totlLeavesArray.object(at: indexPath.row) as! NSDictionary
        cell.acknowled_lbl.text = localDic["acknowledgement"] as? String
        cell.date_lbl.text = localDic["totalDate"] as? String
        cell.reason_lbl.text = localDic["reason"] as? String
        let compareDate = localDic["compare"] as? String
        if(compareDate == "No")
        {
            cell.delet_Btn.isHidden = true
            cell.edit_Btn.isHidden = true
        }
        else
        {
            cell.delet_Btn.isHidden = false
            cell.edit_Btn.isHidden = false
        }
        cell.edit_Btn.tag = indexPath.row
        cell.edit_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.EditViewAction(_:)), for:.touchUpInside)
        cell.delet_Btn.tag = indexPath.row

        cell.delet_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.DeleteAction(_:)), for:.touchUpInside)
        let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
        whiteRoundedView.layer.backgroundColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 1.0, 1.0, 0.9])
        whiteRoundedView.layer.masksToBounds = false
        whiteRoundedView.layer.cornerRadius = 2.0
        whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
        whiteRoundedView.layer.shadowOpacity = 0.2
        cell.contentView.addSubview(whiteRoundedView)
        cell.contentView.sendSubview(toBack: whiteRoundedView)
        cell.contentView.backgroundColor = UIColor.clear
        return cell
    } 

3 个答案:

答案 0 :(得分:0)

通过AutoLayout约束设置标签框,然后构建并运行

答案 1 :(得分:0)

所以我认为这里的问题是细胞保持在44点的估计高度。你遇到的问题是虽然单元的子视图可能会发生变化,但是没有任何东西与单元框架尺寸本身有关。例如,你将whiteRoundedView设置为一定的大小,但这将如何影响单元本身的大小。

有两种基本方法可以解决这种情况:

1)不使用单元格的动态高度,而是使用此方法根据应用程序状态确定每个单元格的高度

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

2)切换到使用自动布局和设置约束将单元格大小与其内容相关联。

最后会再次咬你的另一点是,每次系统需要包含现有单元出列时的单元格时,都要添加whiteRoundedView。出列的单元格在创建时已经添加了whiteRoundedView。您真的想将代码移动到您创建单元格的位置:

if cell == nil {
    tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
    cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell

    let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
    whiteRoundedView.layer.backgroundColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 1.0, 1.0, 0.9])
    whiteRoundedView.layer.masksToBounds = false
    whiteRoundedView.layer.cornerRadius = 2.0
    whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
    whiteRoundedView.layer.shadowOpacity = 0.2
    cell.contentView.addSubview(whiteRoundedView)
    cell.contentView.sendSubview(toBack: whiteRoundedView)
    cell.contentView.backgroundColor = UIColor.clear
}

因此只添加一次。

事实上,如果您使用XIB,为什么不在其中设置阴影视图,然后只需调整参数。

答案 2 :(得分:0)

我通过设置约束值解决了我的问题。我将标签底部约束带到“底部空间到容器”。这是我处理按钮显示和隐藏的代码。但我无法相应地修正行高。但不知怎的,我正在解决设计问题。

if compareDateString == currentDateString
        {
            cell.delete_Btn.isHidden = true
            cell.edit_Btn.isHidden = true
            cell.bottomConstraint.constant = 30
        }

        else if compareDateString! < currentDateString
        {
            cell.delete_Btn.isHidden = true
            cell.edit_Btn.isHidden = true
          cell.bottomConstraint.constant = 30
        }
        else
        {
            cell.delete_Btn.isHidden = false
            cell.edit_Btn.isHidden = false
            cell.bottomConstraint.constant = 45

        }