我将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()
}
})
}
}
答案 0 :(得分:0)
如果您使用的是界面生成器,请尝试将行数设置为0。
或者通过代码textView.textContainer.maximumNumberOfLines = 10
答案 1 :(得分:0)
首先,您不需要为textView的Parent设置高度。即使您确实为textView的父级设置了较低的优先级。
看到图像,紫色是父级,黄色是textView。
在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的底部约束将展开父视图。因此,您也不需要设置父母的身高。