使用自动布局的 UITextView 动态高度 - 每个新行的文本截断顶行

Posted

技术标签:

【中文标题】使用自动布局的 UITextView 动态高度 - 每个新行的文本截断顶行【英文标题】:UITextView Dynamic Height Using Autolayout - Top line of text cutoff with each new line 【发布时间】:2015-05-22 22:40:51 【问题描述】:

我有一个扩展的“消息工具栏”,其工作方式与消息应用程序消息栏类似,用户可以在其中键入文本,并且对于每一行新文本,整个栏的高度都应该增加(直到它达到预定义的最大高度)。 我使用自动布局设置它,并且不断增长的消息栏工作得很好。但问题是,由于某种原因,每次我在消息栏的 UITextView 中找到新的一行文本时,顶行会因为移到 UITextView 框架的上方而略微中断。

这是我在用户输入消息栏时的代码:

func messageToolbarDidUpdateText(messageToolbar: MessageToolbar, textView: UITextView)

    // Expand message bar to fit text view
    let newTextViewHeight = max(self.messageToolbarMinHeight - messageToolbar.textViewTopPadding - messageToolbar.textViewBottomPadding, min(self.messageToolbarMaxHeight - messageToolbar.textViewTopPadding - messageToolbar.textViewBottomPadding, textView.contentSize.height)) // Check that message bar doesn't exceed the limits
    textView.frame.size = CGSizeMake(textView.frame.width, newTextViewHeight)

    let newMessageBarHeight = max(self.messageToolbarMinHeight, min(self.messageToolbarMaxHeight, textView.contentSize.height + messageToolbar.textViewTopPadding + messageToolbar.textViewBottomPadding)) // Check that message bar doesn't exceed the limits
    self.messageToolbar.heightConstraint.constant = newMessageBarHeight

    self.view.updateConstraintsIfNeeded()

这里是我的意思的截图。请注意第一行文本之前 textview 顶部的第一张图像中的间隙。这预计会一直存在,直到消息栏达到最大高度并开始要求在 textview 中滚动新行。但是由于某种原因,即使消息栏仍未达到最大高度,新行也会导致文本的顶行被截断。它也不仅仅是滚动偏移量,因为文本视图在消息栏达到其最大高度之前不允许滚动:

【问题讨论】:

【参考方案1】:

哦,很抱歉发布了 necroposting,但我遇到了同样的问题,终于找到了解决方案。

所以基本上你需要:

if textView.contentSize.height <= textView.height 
    textView.scrollRangeToVisible(NSMakeRange(0, 0))

如果您没有达到最大工具栏高度,它会将文本滚动到正确的位置。如果你到达它,那么你的文本视图内容大小高于它的高度,你不应该有这个问题。

编辑:归功于 https://***.com/a/19047464/1316040 提到 HPGrowingTextView。 https://github.com/HansPinckaers/GrowingTextView 为...好吧,现有的 https://github.com/KennethTsang/GrowingTextView 实际代码行 scrollRangeToVisible

【讨论】:

谢谢!花了两个小时试图弄清楚这一点

以上是关于使用自动布局的 UITextView 动态高度 - 每个新行的文本截断顶行的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局自定义集合视图单元格的动态高度

用于 UITextView 文本的 iOS 8 sizeThatFits 未返回正确的高度(自动布局)

UITextView 使用自动布局动态扩展为滚动视图内的文本

UITableViewCell 扩展自动布局

UIScrollView 中的 UITextView 使用自动布局

内容拥抱和内容压缩阻力、自动布局约束的问题