如何根据文本长度使UITextView高度动态变化?

112

从这张图片中可以看到,UITextView的高度会根据文本长度改变,我希望它能够根据文本长度自动调整高度。

*我看到了其他的问题,但那里的解决方案对我没有用。

example


可能是如何根据UITextView的内容设置大小?的重复问题。 - Samuel Noyes
我使用nextGrowingTextView https://github.com/muukii/NextGrowingTextView 我甚至在Objective c中编写了一个实现 https://github.com/mcmatan/NextGrowingInternalTextViewObjectiveC - MCMatan
CSGrowingTextView也是解决这个问题的另一种选择:https://github.com/cloverstudio/CSGrowingTextView - Josip B.
请确保将拥抱和压缩阻力优先级设置为较低。 - Ethan SK
这些天它是完全自动化的 - 不要忘记禁用滚动。显然,您需要在视图周围设置正确的约束(与任何视图一样)。 - Fattie
不,这不是因为你太胖了。如果你使用本地字体,那肯定没问题,但一旦你导入另一种字体,问题就来了。 - Async-
23个回答

0

iOS 8.3 中在使用 textView.textContainer.maximumNumberOfLines = 10 时有两个需要注意的问题。

请参考我的 gist

textView.attributedText = originalContent

let lineLimit = 10
textView.isEditable = true
textView.isScrollEnabled = false
textView.textContainerInset = .zero // default is (8, 0, 8, 0)
textView.textContainer.maximumNumberOfLines = lineLimit // Important condition
textView.textContainer.lineBreakMode = .byTruncatingTail

// two incomplete methods, which do NOT work in iOS 8.3

// size.width可能比maxSize.width小 ————遗憾的是 iOS 8.3 上此方法无视maximumNumberOfLines参数,所以得借助于UILabel
// size.width may be less than maxSize.width, ---- Do NOT work in iOS 8.3, which disregards textView.textContainer.maximumNumberOfLines
// let size = textView.sizeThatFits(maxSize) 

// 遗憾的是 iOS 8.3 上此方法失效了,得借助于UILabel
// Does not work in iOS 8.3
// let size = textView.layoutManager.usedRectForTextContainer(textView.textContainer).size 

// Suggested method: use a temperary label to get its size
let label = UILabel(); label.attributedText = originalContent
let size = label.textRect(forBounds: CGRect(origin: .zero, size: maxSize), limitedToNumberOfLines: lineLimit).size
textView.frame.size = size

0

这里是声明

    fileprivate weak var textView: UITextView!

在这里调用您的setupview函数

    override func viewDidLoad() {
        super.viewDidLoad()

         setupViews()
    }

在这里进行设置

    fileprivate func setupViews() {

    let textView = UITextView()
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.text = "your text here"
    textView.font = UIFont.poppinsMedium(size: 14)
    textView.textColor = UIColor.brownishGrey
    textView.textAlignment = .left
    textView.isEditable = false
    textView.isScrollEnabled = false
    textView.textContainerInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)

   self.view.addSubview(textView)

   self.textView = textView

   setupConstraints()

   }

在这里设置约束条件

   fileprivate func setupConstraints() {

    NSLayoutConstraint.activate([

        textView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
        textView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20),
        textView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20),
        textView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20),
        textView.heightAnchor.constraint(greaterThanOrEqualToConstant: 150),
        ])
  }

0
如果您想在控制器加载时预加载textView。请从视图didload()中调用此函数:
func textViewDidChange(_ textView: UITextView) {   
    let esmitated = CGSize(width: txtView.frame.width, height: .infinity)
    let esmitatedSize = txtView.sizeThatFits(esmitated)
    self.heghtConstraint.constant = esmitatedSize.height
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接