如何在用户键入时使 UITableView 单元格动态更改其高度?

use*_*456 5 uitableview ios swift

我目前正在开发一项功能,可在键入时动态更改 UITableView 单元格的高度。因此,如果用户输入了一个扩展单元格当前最大宽度的项目,那么单元格的高度应该增加。我的专用 TableViewCell 包含一个 TextView 和一个 UILabel 并且还连接到它下面的另一个单元格。因此,在一个 TableView 中有一个带有两个 TableViewCell 的 TableView。我一直在尝试尝试可以解决的方法,但到目前为止没有任何效果。有没有人有任何概念性的想法来完成它?

Au *_*Ris 7

首先将您的 tableView rowHeight 设置为UITableViewAutomaticDimension,在您的表格视图单元格中添加带有顶部、前导、底部和尾部约束的 UITextView。设置textView.isEditabletruetextView.isScrollEnabledfalse,然后实现TextView的委托方法textViewDidChange。当文本更改时,您需要向视图控制器报告以更新 tableview,一种方法是通过委托。在您的视图控制器中实现您的表格视图单元格委托,您将从那里调用tableView.beginUpdates()tableView.endUpdates()。就是这样。下面是一个经过测试的工作示例。

你的视图控制器:

import UIKit
class ViewController: UIViewController, UITableViewDataSource, ExpandingTableViewCellDelegate {

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.register(UINib(nibName: "ExpandingTableViewCell", bundle: nil), forCellReuseIdentifier: "ExpandingTableViewCellIdentifier")
        tableView.rowHeight = UITableViewAutomaticDimension
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ExpandingTableViewCellIdentifier", for: indexPath) as! ExpandingTableViewCell
        cell.delegate = self
        return cell
    }

    // Expanding teable view cell delegate
    func didChangeText(text: String?, cell: ExpandingTableViewCell) {
        tableView.beginUpdates()
        tableView.endUpdates()
    }
}
Run Code Online (Sandbox Code Playgroud)

你的手机:

import UIKit
protocol ExpandingTableViewCellDelegate: class {
    func didChangeText(text: String?, cell: ExpandingTableViewCell)
}

class ExpandingTableViewCell: UITableViewCell, UITextViewDelegate {
    @IBOutlet weak var textView: UITextView!
    weak var delegate: ExpandingTableViewCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()

        textView.delegate = self
        textView.isEditable = true
        textView.text = "Start typing: ..."
        textView.isScrollEnabled = false
    }

    func textViewDidChange(_ textView: UITextView) {
        delegate?.didChangeText(text: textView.text, cell: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

示例项目在这里:https : //github.com/bavarskis/ExpandingTableViewCell.git