UITextView 和单元格根据 textview 的内容动态更新高度?

Posted

技术标签:

【中文标题】UITextView 和单元格根据 textview 的内容动态更新高度?【英文标题】:UITextView and cell dynamically update height based on content of textview? 【发布时间】:2015-07-17 22:21:15 【问题描述】:

我遇到了关于自定义单元格内的 UITextView 的问题。除了我的问题之外,textView 还可以完美运行。 我设置了 UITextViewDelegate 方法,因此当 textview 发生问题时,我连接了这些方法。

我想知道如何让我的自定义单元格在用户键入时动态增加它的高度。一旦用户点击 textview 行的末尾,也让 textview 自动添加另一行。 我在网上搜索了一段时间,这个问题的大部分例子都在objective c中。没有太多的快速代码。我将不胜感激任何帮助。

我已经将我的单元格连接到 tableview 文件中......

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

      let cell: cellCustom =  the_TableView.dequeueReusableCellWithIdentifier("cell") as! cellCustom

        return cell
 

在自定义单元格文件中,我设置了代表...

func textViewDidChange(textView: UITextView) 


    


func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool 


        return true
    

我尝试过一些类似...

self.textview.sizeToFit() 

self.the_TableView.rowHeight = UITableViewAutomaticDimension
        self.the_TableView.estimatedRowHeight = 47

当我这样做时,textview 获取了所有文本,但在我辞去它的第一响应者并向上滚动以使单元格消失之前,它的大小没有增加。然后当单元格反弹回来时,它会更新。

我已经添加了所有的约束,并且该项目具有零风险或错误并且可以完美运行。

为了澄清,我希望 uitextview 根据用户在键入时键入的内容来更改高度,这意味着必须更新自定义单元格和表格视图。想想 iPhone 上的清晰应用程序。就像那样。当用户键入时,单元格会动态更新,高度增加,同时在用户到达末尾时添加新行。这就是我的目标。

尽管我对开发并不陌生,但我以前从未真正达到过开发这一点。任何帮助将不胜感激。因为我在另一个文件中有我的自定义单元格,所以我很难从 tableview 文件中访问我的单元格元素。估计还是新手。感谢您阅读本文。

【问题讨论】:

链接你的约束,textView 到单元格顶部,textView 到单元格底部,并将你的 textview 的高度约束设置为固定高度。然后添加你需要的另一个约束。然后在你更改 textView 的高度约束之后,您为当前单元格调用layoutIfNeeded() @pandarencodemaster 感谢您的意见。我已经实现了我所有的约束。但是,添加高度约束会在调试器中引发多种风险。这些约束在所有设备中都能完美运行。另外,您能详细说明一下layoutIfNeeded 吗? 如果你想让你的约束更新生效,你应该使用 layoutIfNeeded 让它们在你改变任何约束后立即生效。 @pandarencodemaster 这似乎不起作用。我已将它添加到单元格中,但 textview 只是继续获取​​数据并且不会增加高度。 textView 也链接到单元格。谢谢你的尝试。我很感激。 您是否在更改文本视图的高度后立即尝试self.tableView.layoutIfNeeded() 【参考方案1】:

这也适用于 ios 7

这会进入你的 tableviewcell

protocol HeightForTextView 
    func heightOfTextView(height: CGFloat)
    


class TableViewCell: UITableViewCell 

    @IBOutlet weak var textView: UITextView!
    
    weak var delgate: HeightForTextView?
    
    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    func textViewDidChange(textView: UITextView) 
        
        var fixedWidth: CGFloat = textView.frame.size.width
        var newSize: CGSize = textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat.max))
        
        if let iuDelegate = self.delgate 
            
            iuDelegate.heightOfTextView(newSize.height)
        
        
        
    


你的 tableview 控制器应该是

 class TableViewController: UITableViewController,HeightForTextView 
    
        var textViewHeight = CGFloat()
        
    //In your cell for row method set your your delegate 
 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell
    cell.delgate = self

    return cell



//delegate method

    func heightOfTextView(height: CGFloat) 
        
    textViewHeight = height
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
        
    

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
            
            return textViewHeight + 70
    
    
    

【讨论】:

谢谢!这行得通。我必须有一个扩展名才能调用 tableview,因为 textview 在一个单独的文件中。从技术上讲,它正在制作一个新的表格视图。有点草率。 在该文件中编写一个委托或添加一个观察者,这样您就可以在文本更改时获取高度并重新加载表格视图。如果不清楚,我可以帮助您... 我会很感激你会如何做到这一点。自从我添加了扩展后,我的按钮滞后了 2 秒,这在 UI 方面是不可接受的。我真的很想得到你的帮助。您将如何添加观察者?我的自定义单元格在另一个文件中,所以我无法访问我的表格视图。你会如何处理这个问题?再次感谢您在上面的回答。我很感激。 非常感谢。非常感谢! 我可以在目标 c 中获取此集合视图单元格吗?

以上是关于UITextView 和单元格根据 textview 的内容动态更新高度?的主要内容,如果未能解决你的问题,请参考以下文章

调整表格视图单元格以显示 UITextView 和 UIWebView

选择单元格内的自定义 UITextView 时选择单元格

UICollectionViewCell里面的UITextView坚持横向增长

UITextView 底部有更多文字和更多空白

保存链接到单元格的 UITextView 文本

UITable Cell 在单元格中有 UITextView 时无法选择