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

时间:2016-09-14 07:38:25

标签: ios swift uitableview

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

tableView.estimatedRowHeight = 155
tableView.rowHeight = UITableViewAutomaticDimension

这段代码让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    
    }
}

在运行时更改UITextView的文本后,UITextView的高度会发生变化,但UITableViewCell的高度不会更改。我怎么能改变呢?非常感谢帮助。

enter image description here enter image description here

7 个答案:

答案 0 :(得分:20)

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

http.get(...).subscribe(val => this.data = val);

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

UITableView中的自定义UITextView

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

答案 1 :(得分:8)

如果您使用UITableViewAutomaticDimension,则必须从上到下设置序列约束。没有自动布局或适当的约束UITableViewAutomaticDimension不会起作用。因此,您可以管理此类内容:set top,bottom,leading,trailing and fixed height约束textview。然后选择fixed height constraint的出口并增加它constant而不是改变或设置textview框架,我认为每个都可以工作!

答案 2 :(得分:4)

我正在改善Lion的答案。

如果使用的是UITableViewAutomaticDimension,则必须从上到下设置串行约束。没有自动布局或适当的约束,UITableViewAutomaticDimension将无法工作。因此,您可以管理以下内容:对文本视图设置顶部,底部,行距,尾随和固定高度约束。禁用UITextview的滚动功能,即可完成。不需要固定高度限制。

答案 3 :(得分:3)

您需要禁用文本视图的滚动,以根据textView的内容大小自动调整tableViewCell的大小。

答案 4 :(得分:0)

第1步,禁用TextView滚动
第2步,添加顶部,左侧,右侧和底部约束
第3步,将Delegate设置为textView
步骤4,在UITextViewDelegate方法下面实现

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

答案 5 :(得分:0)

在Swift 4.2中更新代码
信用:http://www.swiftdevcenter.com/the-dynamic-height-of-uitextview-inside-uitableviewcell-swift/
创建一个名称为GrowingCell的自定义单元格,在该单元格中添加UITextView并为此创建一个Outlet。在ViewController类的UITableView中注册此单元格。 您的ViewController:

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)
            }
        }
    }
}

现在移至“自定义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)
        }
    }
}

有关更多详细信息:visit this full demo

答案 6 :(得分:-1)

不确定它是否可以帮助您,但是我自定义了一个UITextView,它适合内容的高度作为其高度。

这是UITableViewCell中的TextView:

final class ContentFittingTextView: UITextView {
    override var contentSize: CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
}

并通过您的UITableView:

tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 44