使用Autolayout的UITextView动态高度 - 每个新行

时间:2015-05-22 22:40:52

标签: ios autolayout uitextview overflow messages

我有一个扩展的“消息工具栏”,其工作方式与消息应用消息栏类似,用户可以在其中键入文本,并且每个新文本行的整个栏应该增加高度(直到它达到预定义的最大高度)。 我使用自动布局进行设置,不断增长的消息栏工作得很好。但问题是,由于某些原因,每次我在消息栏的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中滚动新行。但由于某些原因,即使消息栏仍未达到其最大高度,新行也会导致文本的顶行被截断。它不仅仅是一个滚动偏移,因为textview不允许滚动直到消息栏满足其最大高度: enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

哦,对不起necroposting,但我有同样的问题,终于找到了解决方案。

基本上你是这样的:

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

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

编辑:致信 https://stackoverflow.com/a/19047464/1316040提及HPGrowingTextView。 https://github.com/HansPinckaers/GrowingTextView表示......好吧,现有的 https://github.com/KennethTsang/GrowingTextView用于实际的代码行scrollRangeToVisible