自定义uitextview直到特定高度

时间:2018-02-05 11:53:05

标签: ios swift uitextview

我有一个具有聊天功能的应用,其中UITextview用于输入消息。 UITextview高度必须是动态的(如果用户输入消息,则必须根据文本长度更改高度,直到达到特定高度)。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:6)

禁止滚动textView。

enter image description here

enter image description here

将高度增加到特定值,然后启用滚动。

提供最大高度限制,然后将此代码添加到viewController

 class YourViewController: UIViewController, UITextViewDelegate
    {
        @IBOutlet weak var yourTextView: UITextView!

        let textViewMaxHeight: CGFloat = 100
        override func viewDidLoad()
        {
            super.viewDidLoad()
            yourTextView.delegate = self
        }

        func textViewDidChange(textView: UITextView)
        {
            if textView.contentSize.height >= self.textViewMaxHeight
            {
                textView.scrollEnabled = true
            }
            else
                {
                textView.frame.size.height = textView.contentSize.height
                textView.scrollEnabled = false
            }
        }
    }

答案 1 :(得分:3)

为textView添加高度约束并创建一个插座,以便进行调整。然后你可以使用UITexfield委托方法textViewDidChange(_ textView:UITextView)来调整高度。

func textViewDidChange(_ textView: UITextView) {

    // get the current height of your text from the content size
    var height = textView.contentSize.height

    // clamp your height to desired values
    if height > 90 {
        height = 90
    } else if height < 50 {
        height = 50
    }

    // update the constraint
    textViewHeightConstraint.constant = height
    self.view.layoutIfNeeded()
}

更短的版本......

func textViewDidChange(_ textView: UITextView) {
    let maxHeight: CGFloat = 90.0
    let minHeight: CGFloat = 50.0
    textViewHeightConstraint.constant = min(maxHeight, max(minHeight, textView.contentSize.height))           
    self.view.layoutIfNeeded()
}

答案 2 :(得分:0)

如果您要继承UITextView,这也可能是一种解决方案:

class Message: UITextView {


    var maximalSizeNotScrollable: CGFloat = 200
    var minimumHeightTextView: CGFloat = 35

    var textViewHeightAnchor: NSLayoutConstraint!


    override var contentSize: CGSize {
        didSet {

            if textViewHeightAnchor != nil {
                textViewHeightAnchor.isActive = false

            }
            textViewHeightAnchor = heightAnchor.constraint(equalToConstant: min(maximalSizeNotScrollable, max(minimumHeightTextView, contentSize.height)))
            textViewHeightAnchor.priority = UILayoutPriority(rawValue: 999)

            textViewHeightAnchor.isActive = true
            self.layoutIfNeeded()
        }
    }
}

优先级必须小于1000,否则_UITemporaryLayoutHeight会遇到问题。

答案 3 :(得分:0)

我在同一个问题上挣扎。阅读@Anuraj的回复后,我将UITextView的高度限制拖放到视图控制器上,因为当textview达到最大高度并且启用滚动时,textview越来越小,只显示一行,因此我找到了解决方案最大高度到textview的高度限制。 Textview将一直扩展到最大高度,然后再滚动。删除文本时,textview的高度将自动变小。

@IBOutlet weak var txMessageHeight: NSLayoutConstraint!    
let textViewMaxHeight: CGFloat = 120

func textViewDidChange(_ textView: UITextView) {
    if textView.contentSize.height >= self.textViewMaxHeight{
        txMessageHeight.constant = self.textViewMaxHeight
        textView.isScrollEnabled = true
    }else{
        textView.frame.size.height = textView.contentSize.height
        textView.isScrollEnabled = false
    }
}