自动布局和滚动的怪异TextView行为

时间:2018-06-21 02:32:58

标签: swift autolayout textview

我正在尝试构建与iMessage / WhatsApp类似的TextView,即一个TextView,其高度随着内容的增长而增加,但一旦达到一定高度也可以滚动。

我将textView设置为textContainerInsent为[8,0,8,0],高度为38,并且随着内容的增加,可以使用自动布局轻松调整TextView的大小。

当我尝试启用滚动时出现问题。每当我的textView有一行新的文本时,我的textContainerInsent就会感到困惑,并向上“推”我的文本(这意味着第一行文本在TextView的外面被切成一半)。出于某些甚至更奇怪的原因,这种情况仅每隔一行发生一次(因此在第二,第四,第六等)。

这也仅在新行的第一个字符处发生,并会迅速恢复到后续字符处(参见图片)。

通过将偶数行的top textContainerInsent强制为16([16,0,8,0]),而对于奇数行将其保持为[8,0,8,0],我可以将某些东西混在一起。 / p>

然而,这远非理想之举:

  • 当我关闭文本时,查看我插入的占位符文本再次被向上推,但找不到解决该问题的方法
  • 即使试图将textContainerInsent强制为[16,0,8,0],仍然有一个像素左右的微小移动。

是什么原因造成的?我是否对textContainerInsents / TextView或ContentSize有误解?您对造成这种情况的根本原因的任何想法都将受到赞赏(并且不要过多地关注我的hack……无论如何我都希望摆脱它)。

我找到了以下有用的线程,但是我尝试了建议的答案,但它们对我不起作用(因为我不是在尝试删除所有填充并希望保持滚动状态):

How to lose margin/padding in UITextView?

ContentInsent too high when text is wrapped to next line ContentInsent snaps back at right place at the next character

    // Called by textViewDidChange delegate
    @objc func handleTextViewSearch() {

        let maxTextViewHeight : CGFloat = 180

        textView.isScrollEnabled = true
        textView.showsVerticalScrollIndicator = true

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

        let sizeHeight = min(maxTextViewHeight, textView.contentSize.height )

        // This is my textView Height Constraint

        viewHeightConstraint.constant = sizeHeight
        textView.contentOffset = CGPoint(x: 0, y: 0)

        // This my hack to manually "push" my text back when it jumps by increasing my textContainerInsent to [16,0,8,0]... It almost fixes the issue but doesn't address the root cause for the weird TextView behavior...

        if textView.contentSize.height > textView.frame.height && textView.contentSize.height <= (maxTextViewHeight - 10) {


            // Weird micro readjustment: When line goes from 1 to 2, need to increase insent by another 8 points but only when going from odd to even lines (go figure)...

            var insentAdjustment : CGFloat = 0
            let linesNumber = numberOfLines(textView: textView)
            if linesNumber % 2 == 0 {
                print("Is even number")
                insentAdjustment = 8
            } else if linesNumber == 1 {
                insentAdjustment = 8
            }

            textView.frame.size.height = textView.contentSize.height
            textView.textContainerInset = UIEdgeInsetsMake(8 + insentAdjustment, 0, 8, 0)


            print("Post update TextView: ", textView)
        }
     }

0 个答案:

没有答案