UITableViewAutomaticDimension 不起作用

UITableViewAutomaticDimension is not working

提问人:Anu 提问时间:11/16/2018 最后编辑:Anu 更新时间:11/17/2018 访问量:803

问:

我已将tableview的估计高度和高度设置为UIAutomaticDimension,但是我的标签高度增加了。

我尝试更改但仍然不起作用。label.preferredMaxLayoutWidth

我已将tableview的估计高度和高度设置为UIAutomaticDimension,但是我的标签高度增加了。

我尝试更改但仍然不起作用。label.preferredMaxLayoutWidth

func numberOfSections(in tableView: UITableView) -> int { 返回 1 }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if let buildingArr = buildingViolationArray {
        return buildingArr.count
    }
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: Language.sharedInstance.isEnglish ? "CELL" : "CELL_AR", for: indexPath) as! BuildingViolationHeaderTableViewCell
    if let buildingViolationsDict = buildingViolationArray?[indexPath.row] {

        cell.followUpNoLbl.text = buildingViolationsDict["followupNo"] as? String
        cell.violationTypeLbl.text = buildingViolationsDict[Language.sharedInstance.isEnglish ? "violationType" : "violationTypeArb"] as? String
        cell.bvBtn.addTarget(self, action: #selector(BuildinVioClicked), for: .touchUpInside)
        if buildingViolationsDict[kIsSelectedKey] as? Bool == true {
            cell.isCellSelected = true
            let buildingVioView = getZoneRegView(buildingViolationsDict)
            buildingVioView.tag = 1
            for removeSubViews in cell.bvStackView.subviews {
                removeSubViews.removeFromSuperview()
                cell.bvStackView.removeArrangedSubview(removeSubViews)
            }

            cell.bvStackView.addArrangedSubview(buildingVioView)
            cell.expandImage.image = UIImage(named: "minus-256")
        } else {
            cell.isCellSelected = false
            for removeSubViews in cell.bvStackView.subviews {
                removeSubViews.removeFromSuperview()
                cell.bvStackView.removeArrangedSubview(removeSubViews)
            }
            cell.expandImage.image = UIImage(named: "plus-256")
        }

        cell.violationTypeLbl.preferredMaxLayoutWidth = cell.violationTypeLbl.frame.size.width
    }

    cell.selectionStyle = .none

    return cell
}

func BuildinVioClicked(sender: UIButton){
    let location = sender.convert(CGPoint.zero, to: bvTableView)
    let indexPath = bvTableView.indexPathForRow(at: location)!
    if var buildingViolationsDict = buildingViolationArray?[indexPath.row] {
        if let isSelect = buildingViolationsDict[kIsSelectedKey] as? Bool, isSelect {
            (buildingViolationArray[indexPath.row])[kIsSelectedKey] = false
        } else {
            (buildingViolationArray[indexPath.row])[kIsSelectedKey] = true
        }
        bvTableView.reloadData()
    }
}

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

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
iOS的 iPhone Swift iPad iOS7

评论

1赞 Prashant Tukadiya 11/16/2018
请提出问题,并提供有关问题的足够信息。提供您编写的代码。
0赞 Jay Mehta 11/16/2018
到目前为止,你尝试过什么?,在您尝试了某些方法但没有奏效后,我们会在这里为您提供帮助。尝试详细描述您的问题。
0赞 Aakash 11/16/2018
将估计高度设置为估计值,而不是确保设置了适当的约束,以便自动尺寸正常工作UITableViewAutomaticDimension
2赞 FedeH 11/16/2018
我建议尝试使用更简单的单元格设计,里面只有一个标签,看看它是否有效。之后,您可以在其上添加您的设计并隔离问题。

答:

0赞 Amadeu Real 11/17/2018 #1

除了设置 to (在 Swift 4 中,已重命名为 )。您应该正确设置单元格约束。estimatedRowHeightUITableViewAutomaticDimensionUITableViewAutomaticDimensionUITableView.automaticDimension

class YourCell: UITableViewCell {
  lazy var label: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.font = UIFont.systemFont(ofSize: 12)
    label.numberOfLines = 0 // This property will allow the label according to his content
    return label
  }()

  func addLabelIntoView() {
    contentView.addSubview(label)
    let margin = contentView.layoutMarginsGuide
    NSLayoutConstraint.activate([
      label.leadingAnchor.constraint(equalTo: margin.leadingAnchor),
      label.trailingAnchor.constraint(equalTo: margin.trailingAnchor),
      label.topAnchor.constraint(equalTo: margin.topAnchor),
      label.bottomAnchor.constraint(equalTo: margin.bottomAnchor) // Pins bottom of label into the bottom of the view
      ])
  }
}