UITextView不在nextLine上打印文本吗?

时间:2019-05-15 17:11:31

标签: ios swift uitextview

我将UITextView放在UIView中。 UIView随着用户在UITextView中的键入而展开,但问题是,如果用户在下一行中键入,则直到用户在第三行上键入时,它才会显示正在键入的文本,然后它会显示在第二行。第三行和第四行,等等。

我该如何解决?

func textViewDidChange(_ textView: UITextView) {
    print(textView.text)
    let size = CGSize(width: prayerRequest.frame.width, height: .infinity)

    let estimatedSize = textView.sizeThatFits(size)
    textView.constraints.forEach { (constraints) in
        if constraints.firstAttribute == .height {
            constraints.constant = estimatedSize.height

        }

        viewContainer.constraints.forEach({ (constraints) in
            if constraints.firstAttribute == .height {
                constraints.constant = estimatedSize.height
                viewContainer.layoutIfNeeded()
            }
        })
    }

}

2 个答案:

答案 0 :(得分:0)

如果您使用的是界面生成器,请尝试将行数设置为0。

或者通过代码textView.textContainer.maximumNumberOfLines = 10

答案 1 :(得分:0)

首先,您不需要为textView的Parent设置高度。即使您确实为textView的父级设置了较低的优先级。

看到图像,紫色是父级,黄色是textView。

enter image description here

在viewDidLoad中,添加以下代码:

textView.textContainerInset = UIEdgeInsets.zero
textView.textContainer.lineFragmentPadding = 0

然后,实现textView Delegate方法:

extension ViewController : UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        let textHeight = textView.attributedText.boundingRect(with: 
            CGSize.init(width: textView.frame.width, height: .infinity),
               options:[.usesLineFragmentOrigin, .usesFontLeading],
               context: nil).height

        if previousHeight != textHeight {
            previousHeight = textHeight
            print("Height text: \(textHeight)")
            textViewHeight.constant = textHeight
            self.view.layoutIfNeeded()
            textView.setContentOffset(.zero, animated: false)
        }
    }
}

textViewHeight 是textView的高度限制。 将var previousHeight = CGFloat(0)初始化为实例变量。这将有助于仅在更改高度时才限制对layoutIfNeeded的调用。

textView的底部约束将展开父视图。因此,您也不需要设置父母的身高。