Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当文本到达N行时开始滚动的UITextView_Ios_Swift_Uiscrollview_Uikit_Uitextview - Fatal编程技术网

Ios 当文本到达N行时开始滚动的UITextView

Ios 当文本到达N行时开始滚动的UITextView,ios,swift,uiscrollview,uikit,uitextview,Ios,Swift,Uiscrollview,Uikit,Uitextview,我开始在聊天应用程序中实现文本输入,我想知道启用滚动的UITextView的标准行为是否完全不符合预期。 我只想在WhatsApp之类的聊天中完成。当文本到达N,5(例如行)时,滚动条出现,文本容器开始滚动。我写了这样的代码,但不起作用。 我认为需要计算文本容器中的行数并进行内容插入,或者类似的事情 func textViewDidChange(_ textView: UITextView) { let fixedWidth = myTextView.frame.size.

我开始在聊天应用程序中实现文本输入,我想知道启用滚动的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
    }()

不是基于行数,而是基于用户定义的高度。您可以在这里找到答案:

如果希望发生这种行为,很简单:

  • 创建内部包含UITextView的UIView
  • 在UIView priority 1000中创建一个小于或等于最大高度、也大于或等于最小高度的高度约束
  • 在文本视图中创建与最小高度相等的高度约束
  • 然后将此代码添加到控制器中
  • 代码:


    这与WhatsApp textView的行为相同

    如果您熟悉Objective-C,则可能会有所帮助…另一种选择是使用表视图而不是文本视图。请尝试按原样创建uitextview,但不限制最大行数。然后在textViewDidChange中,当你的行数超过5行时进行计算,并在那里将可滚动更改为true。滚动该textView,而不是实际滚动,它只是扩展。你找到这个问题的答案了吗?
    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
                }
            }
        }
    }