Swift /如何使用动态高度的UITextView INSIDE UITableViewCell具有动态高度

Dav*_*eek 11 uitableview ios swift

我正在使用以下代码使UITableViewCell具有动态高度:

tableView.estimatedRowHeight = 155
tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)

这段代码让UITextView根据内容改变它的高度.

extension NewUserTweetTableVC: UITextViewDelegate {

    func textViewDidChange(textView: UITextView) {
        let fixedWidth = textView.frame.size.width
        textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        var newFrame = textView.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        textView.frame = newFrame    
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我在运行时更改了UITextView的文本,UITextView的高度就会改变,但UITableViewCell的高度却没有.我怎么能改变呢?非常感谢帮助.

在此输入图像描述 在此输入图像描述

Rah*_*ani 23

以编程方式获取textview的高度...

let textView = UITextView()//your Text view
let sizeThatShouldFitTheContent = textView.sizeThatFits(textView.frame.size)
let height = sizeThatShouldFitTheContent.height
Run Code Online (Sandbox Code Playgroud)

或试试这个演示......

在UITableView中自定义UITextView

https://damienpontifex.com/2014/10/01/self-sizing-uitableviewcell-with-uitextview-in-ios8/

  • 现在链接已关闭:( (8认同)
  • 甚至堆栈流也不希望人们只是发布链接,因为链接可以关闭,这实际上帮助了我. (3认同)

Lio*_*ion 11

如果要使用,UITableViewAutomaticDimension则必须从上到下设置串行约束。没有自动布局或适当的约束UITableViewAutomaticDimension将不起作用。因此,您可以管理以下内容:对的set top,bottom,leading,trailing and fixed height约束textview。然后fixed height constraint增加它的出口,而constant不是改变或设置textview的框架,我想一切都可以!

  • 需要禁用文本视图的滚动 (16认同)

iOS*_*fee 10

Step 1, 禁用TextView的滚动
Step 2, 添加Top, Left, Right, bottom约束
Step 3, Delegate设置为textView
Step 4, 下面实现UITextViewDelegate方法

- (void)textViewDidChange:(UITextView *)textView {
[UIView setAnimationsEnabled:false];
[textView sizeToFit];
[self.tableView beginUpdates];
[self.tableView endUpdates];
[UIView setAnimationsEnabled:true];}
Run Code Online (Sandbox Code Playgroud)


Amr*_*dhu 5

我正在改进狮子的答案。

如果你使用 UITableViewAutomaticDimension 那么你必须从上到下设置串行约束。如果没有自动布局或适当的约束, UITableViewAutomaticDimension 将无法工作。所以你可以像这样管理这个东西:为你的文本视图设置顶部、底部、前导、尾随和固定高度约束。禁用 UITextview 的滚动功能就大功告成了。您不需要固定高度约束。


Ash*_*han 5

更新 Swift 4.2 中的代码
Credit: http://www.swiftdevcenter.com/the-dynamic-height-of-uitextview-inside-uitableviewcell-swift/
创建一个名为 GrowingCell 的自定义单元格,在单元格中添加 UITextView 并创建一个 Outlet这个的。在 ViewController 类的 UITableView 中注册此单元格。你的视图控制器:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let nib = UINib(nibName: "GrowingCell", bundle: nil)
        self.tableView.register(nib, forCellReuseIdentifier: "GrowingCell")
        self.tableView.tableFooterView = UIView()
        self.tableView.dataSource = self
    }
}

extension ViewController: UITableViewDataSource {

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

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

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

}

extension ViewController: GrowingCellProtocol {
    // Update height of UITextView based on string height
    func updateHeightOfRow(_ cell: GrowingCell, _ textView: UITextView) {
        let size = textView.bounds.size
        let newSize = tableView.sizeThatFits(CGSize(width: size.width,
                                                        height: CGFloat.greatestFiniteMagnitude))
        if size.height != newSize.height {
            UIView.setAnimationsEnabled(false)
            tableView?.beginUpdates()
            tableView?.endUpdates()
            UIView.setAnimationsEnabled(true)
            // Scoll up your textview if required
            if let thisIndexPath = tableView.indexPath(for: cell) {
                tableView.scrollToRow(at: thisIndexPath, at: .bottom, animated: false)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在移动到您的 Custom GrowingCell 单元并添加以下代码:

import UIKit

protocol GrowingCellProtocol: class {
    func updateHeightOfRow(_ cell: GrowingCell, _ textView: UITextView)
}

class GrowingCell: UITableViewCell {

    weak var cellDelegate: GrowingCellProtocol?
    @IBOutlet weak var textView: UITextView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        textView.delegate = self
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }
}

extension GrowingCell: UITextViewDelegate {

    func textViewDidChange(_ textView: UITextView) {
        if let deletate = cellDelegate {
            deletate.updateHeightOfRow(self, textView)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多详细信息:请访问完整的演示