UITextView 动态改变大小

Posted

技术标签:

【中文标题】UITextView 动态改变大小【英文标题】:UITextView Changing Size Dynamically 【发布时间】:2016-09-03 18:04:29 【问题描述】:

我正在使用以下代码动态调整包含我的UITextViewcontainerView 的高度

    func textViewDidChange(textView: UITextView) 
    let amountOfLinesToBeShown:CGFloat = 6
    let maxHeight:CGFloat = textView.font!.lineHeight * amountOfLinesToBeShown

    if ((textView.contentSize.height / textView.font!.lineHeight) < 6) 
        topConstraint?.constant = -textView.sizeThatFits(CGSizeMake(textView.frame.size.width, maxHeight)).height - keyboardFrameSize!.height

        containerView.layoutIfNeeded()
        containerView.updateConstraints()
    

问题是,当我打字时,它看起来像这样:

想要的效果是这样的:

【问题讨论】:

【参考方案1】:

这篇文章的最佳答案解决了这个问题。 How do I size a UITextView to its content?

下面的代码不是我的,它来自上面链接的答案(只是为了方便他人而发布):

let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height:CGFloat.max))
var newFrame = textView.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame;

【讨论】:

【参考方案2】:

下面的代码可能是您遇到的这个问题的解决方案。

   func textViewDidChange(textView: UITextView) 
        var newFrame = textView.frame
        var minHeight = 40 // ENTER THE MIN HEIGHT OR THE INITIAL HEIGHT OF THE TEXTVIEW
        var maxHeight = 100 // ENTER THE MAX HEIGHT YOU WANT
        newFrame.size  = textView.sizeThatFits(CGSizeMake(newFrame.size.width, maxHeight)) 

    if newFrame.size.height > minHeight && newFrame.size.height < maxHeight 
        // Change the origin.y value which is 10 to your desired margin for top.
        textView.frame = CGRectMake(0, 10, textView.frame.size.width, newFrame.size.height)
    

【讨论】:

【参考方案3】:

创建一个函数并将其添加到您的 viewDidLoad 方法中,尝试使用:

self.addSubview(containerView)
containerView.addSubview(textView)

containerView.bottomAnchor.constraintEqualToAnchor(self.bottomAnchor).active=true
containerView.leftAnchor.constraintEqualToAnchor(self.leftAnchor).active=true

textView.topAnchor.constraintEqualToAnchor(containerView.topAnchor, constant: 3).active=true
textView.leftAnchor.constraintEqualToAnchor(containerView.leftAnchor, constant: 3).active=true
textView.widthAnchor.constraintEqualToAnchor(containerView.widthAnchor).active=true
textView.heightAnchor.constraintEqualToAnchor(containerView.heightAnchor).active=true

【讨论】:

我应该在我的代码之外执行此操作还是代替我的代码执行此操作?请记住,UITextView 高度应该在我输入时动态变化,将高度锚设置为 30 不会阻止这种情况吗? 可以把heightAnchor作为containerView.heightAnchor。 表现和以前一样 如果 Lines 的数量大于 2 Lines,heightAnchor 容器视图是双倍的。【参考方案4】:

使用 textview textContainerInset 方法来实现你想要的

//insets are top, left, bottom, top..
tv.textContainerInset = UIEdgeInsetsMake(0,0,0,0);

设置此方法后,当textview行开始时,增加textview的高度以查找textview的下一行开始,

使用方法:- TextViewDidChange

【讨论】:

以上是关于UITextView 动态改变大小的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 的内容大小在环绕排除路径后没有改变

如何根据 UITextView 动态调整 xib 的大小

基于 UITextView 动态调整 CGRect 的大小

如何让 UITextView 根据内容动态调整自身大小

如何在 iPhone 中动态更改 UITextView 中文本的字体大小

从 UITextView 中的点击获取单词