0

我正在尝试UITextView在用户输入文本时动态修改 a 的高度(最高为最大高度)。当文本视图中有偶数行时,我遇到了一种非常奇怪的行为。

我正在使用自动布局,并且文本视图有高度限制。我响应对文本视图的委托 ( textViewDidChange(_:)) 的调用,在其中我根据contentSize.

这是代码:

func textViewDidChange(_ textView: UITextView) {
    let newHeight = textView.contentSize.height
    let newConstraintConst = max(MinTextViewHeight, min(MaxTextViewHeight, newHeight))
    self.textViewHeightConstraint.constant = newConstraintConst
}

这很好用,它将框架调整到最大MaxTextViewHeight,然后文本视图可以滚动。但是,当文本视图中有偶数行时,文本视图会在其底部添加一种偏移量NSTextContainer,从而导致顶部行被截断:

顶线被切断

文本容器偏移

但是,当有奇数行时,NSTextContainer不再偏移:

顶线正常

文本容器正常

起初我以为它以某种方式受到文本视图的控制,textContainerInset但这仅用于填充内部的空间NSTextContainer,因为将其设置为.zero删除内部空间但不影响偏移量(顺便说一下,它会变得更糟,因为顶部线几乎完全消失):

删除插图会使情况变得更糟

我查看了UITextView类引用,没有看到任何可以让我操纵甚至获取此偏移值的属性。

作为一种解决方法,我增加了文本容器的顶部插图并删除了底部插图:

textView.textContainerInset = UIEdgeInsetsMake(10, 0, 0, 0)

在此处输入图像描述

到目前为止,这是可行的,但我通过反复试验得出了 10 的值,到目前为止,我只在单个设备上对其进行了测试。

我对需要脆弱的固定值的更hacky解决方法不感兴趣;我试图了解如何设置此偏移量以及修复它的正确方法。希望有人能提供一些见解,谢谢!

4

1 回答 1

1

只是一个猜测,但我认为问题在于文本视图假定其自身的高度在调用时不会改变textViewDidChange,所以它会在它认为必须改变时滚动,而不管你改变它的框架。

不确定您是否认为我的解决方案过于 hacky,但这会在您不想要它时阻止它滚动。只要想要的内容大小小于您的最大大小,我只需将内容偏移固定到顶部。

只需添加以下内容:

func scrollViewDidScroll(scrollView: UIScrollView) {
    if textView.contentSize.height <= MaxTextViewHeight && textView.contentOffset.y > 0.0 {
        textView.contentOffset.y = 0.0;
    }

}
于 2018-03-28T16:31:40.943 回答