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