UITextView在文本到达N行时开始滚动

时间:2017-02-14 20:14:13

标签: ios swift uiscrollview uikit uitextview

我开始在聊天应用程序中实现文本输入,并想知道UITextView的标准行为是否启用滚动绝对不符合预期。
  我希望它只是在像WhatsApp这样的聊天中完成。当文本达到N,例如5行时,滚动条出现,文本容器开始滚动。我写了这样的代码,但它不起作用。   因为我认为需要计算文本容器中的行并使内容插入,或类似的东西。

   func textViewDidChange(_ textView: UITextView) {
        let fixedWidth = myTextView.frame.size.width
        myTextView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
        let newSize = myTextView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
        var newFrame = myTextView.frame
        let oldFrame = myTextView.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        myTextView.frame = newFrame  
        let shift = oldFrame.height - newFrame.height
        textView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: shift, right: 0)
        textView.scrollIndicatorInsets = textView.contentInset
        textView.scrollRangeToVisible(textView.selectedRange)
    }

myTextView指定为:

let myTextView : UITextView = {
        let textView = UITextView()
        textView.translatesAutoresizingMaskIntoConstraints =  false
        textView.isScrollEnabled = false
        textView.textContainer.maximumNumberOfLines = 5
        textView.textContainer.lineBreakMode = .byWordWrapping
        textView.inputAccessoryView = UIView()
        return textView
    }()

2 个答案:

答案 0 :(得分:0)

不是基于行数,而是基于用户定义的高度。您将在这里找到答案: https://stackoverflow.com/a/51235517/10115072

答案 1 :(得分:0)

如果您希望发生这种情况很简单:

  1. 创建一个内部包含UITextView的UIView
  2. 在UIView优先级1000中创建一个高度限制,该高度限制应小于或等于您的MAX_HEIGHT,也应大于或等于您的MIN_HEIGHT
  3. 在您的TextView优先级999中创建一个高度约束,该高度等于您的MIN_HEIGHT
  4. 然后将此代码添加到您的控制器

代码:

class YourViewController: KUIViewController {
    @IBOutlet weak var textView: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
        textView.isScrollEnabled = true
    }
}
extension YourViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        let size = CGSize(width: view.frame.width, height: .infinity)
        let estimatedSize = textView.sizeThatFits(size)
        textView.constraints.forEach { (constraint) in
            if constraint.firstAttribute == .height {
                constraint.constant = estimatedSize.height
            }
        }
    }
}

此行为与WhatsApp textView相同