使用自动布局的 UITextView 动态高度 - 每行新行的文本截断顶行
UITextView Dynamic Height Using Autolayout - Top line of text cutoff with each new line
我有一个扩展的 "Message Toolbar",它的工作方式与“消息”应用程序的消息栏类似,用户可以在其中键入文本,并且整个栏的高度应该随着每一行新文本的增加而增加(直到它达到预定义的最大高度)。
我使用自动布局设置它,并且不断增长的消息栏工作得很好。但问题是,出于某种原因,每次我在消息栏的 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()
}
这里是我的意思的截图。请注意第一行文本之前文本视图顶部的第一张图像中的间隙。在消息栏达到最大高度并开始要求在文本视图中滚动新行之前,它会一直存在。但出于某种原因,即使消息栏仍未达到最大高度,新行也会导致文本的顶行被截断。它不仅仅是滚动偏移,因为文本视图不允许滚动,直到消息栏达到其最大高度:
哦,抱歉发死帖了,但我遇到了同样的问题,终于找到了解决办法。
基本上你需要:
if textView.contentSize.height <= textView.height {
textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
如果您没有达到最大工具栏高度,它会将文本滚动到正确的位置。如果你达到了它,那么你的文本视图内容大小高于它的高度,你不应该有这个问题。
编辑:感谢
提及 HPGrowingTextView。
https://github.com/HansPinckaers/GrowingTextView 对于...好吧,现有的
https://github.com/KennethTsang/GrowingTextView 实际代码行 scrollRangeToVisible
我有一个扩展的 "Message Toolbar",它的工作方式与“消息”应用程序的消息栏类似,用户可以在其中键入文本,并且整个栏的高度应该随着每一行新文本的增加而增加(直到它达到预定义的最大高度)。 我使用自动布局设置它,并且不断增长的消息栏工作得很好。但问题是,出于某种原因,每次我在消息栏的 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()
}
这里是我的意思的截图。请注意第一行文本之前文本视图顶部的第一张图像中的间隙。在消息栏达到最大高度并开始要求在文本视图中滚动新行之前,它会一直存在。但出于某种原因,即使消息栏仍未达到最大高度,新行也会导致文本的顶行被截断。它不仅仅是滚动偏移,因为文本视图不允许滚动,直到消息栏达到其最大高度:
哦,抱歉发死帖了,但我遇到了同样的问题,终于找到了解决办法。
基本上你需要:
if textView.contentSize.height <= textView.height {
textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
如果您没有达到最大工具栏高度,它会将文本滚动到正确的位置。如果你达到了它,那么你的文本视图内容大小高于它的高度,你不应该有这个问题。
编辑:感谢 提及 HPGrowingTextView。 https://github.com/HansPinckaers/GrowingTextView 对于...好吧,现有的 https://github.com/KennethTsang/GrowingTextView 实际代码行 scrollRangeToVisible