行高不会自动更新

时间:2017-05-11 19:21:53

标签: ios swift uitableview autolayout nslayoutconstraint

编辑:

这是我的自定义单元类。它有一个TextField和一个TextView。无论我做什么,我都无法自动更新行高。我知道我可以使用heightForRowAt手动完成,但我不想这样做。

class customCell: UITableViewCell, UITextViewDelegate{

var didSetupConstraints = false

    var titleField : UITextField = {
        var textField = UITextField()
        textField.placeholder = "   Subject (optional)"
        textField.backgroundColor = UIColor.lightGray
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.layer.cornerRadius = 3
        textField.clipsToBounds = true

        return textField
    }()
    var messageView : UITextView = {
        var textView = UITextView()
        textView.text = "Add your email here"
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.backgroundColor = UIColor.red

        return UITextView()
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.contentView.addSubview(titleField)
        self.contentView.addSubview(messageView)
        messageView.delegate = self
        addConstraints()

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func addConstraints(){
        contentView.addConstraints([titleField.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 23),titleField.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -18),titleField.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 18) ])
        titleField.addConstraint(NSLayoutConstraint(item: titleField, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50))

         contentView.addConstraints([messageView.topAnchor.constraint(equalTo: titleField.bottomAnchor, constant: 11),messageView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -18),messageView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 18), messageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -5)])
     messageView.addConstraint(NSLayoutConstraint(item: messageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100))


    }

    override func layoutSubviews() {
        super.layoutSubviews()
        contentView.setNeedsLayout()
        contentView.layoutIfNeeded()
    }

override func updateConstraints() {
    if !didSetupConstraints {
        addConstraints()
        didSetupConstraints = true

    }

    super.updateConstraints()
}


    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.textColor == UIColor.lightGray {
            textView.text = nil
            textView.textColor = UIColor.black
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.text = "Add your email here"
            textView.textColor = UIColor.lightGray
        }
    }



}

我已经看过this question,据我所知,我需要做的事情是:

  • 添加我在tableViewController
  • 中完成的tableView.estimatedRowHeight = 44.0 tableView.rowHeight = UITableViewAutomaticDimension
  • 添加一个底部和顶部约束:我已经将一个topAnchor添加到我的TextField +我的TextField和TextView之间的约束+我的TextView的bottomAnchor和contentView bottomAnchor之间的约束
  • 我已将约束代码添加到updateConstraints()方法中。

不确定我是否还需要做其他事情,但我已经完成了所有这三项工作,但它仍然无法正常工作。我猜测我的底部/顶部约束可能没有正确设置。我得到的当前结果是(textView根本不可见:(()

enter image description here

但我期望获得的是:

enter image description here

编辑2

见图:

enter image description here

在所有修复之后,我现在唯一的问题是空单元格的默认大小不是44,是不是tableView试图变聪明并根据最后一个调整行高细胞高度?

1 个答案:

答案 0 :(得分:1)

一些事情:

  1. updateConstraints可以被系统多次调用,因此请使用标志仅在第一次添加约束时。
  2. messageView.topAnchor.constraint(equalTo: titleField.topAnchor, constant: 11)应为messageView.topAnchor.constraint(equalTo: titleField.bottomAnchor, constant: 11)
  3. 尝试给messageView一个高度。
  4. 正如@Honey指出的那样,textView初始化时未返回messageView
  5. 关于空单元格高度,如果您根本不想要空单元格,只需执行tableView.tableFooterView = UIView()即可删除它们。可能就像你说的那样,桌面视图对于单元格高度非常聪明。