Ios 当文本到达N行时开始滚动的UITextView
我开始在聊天应用程序中实现文本输入,我想知道启用滚动的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.
我只想在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
}()
不是基于行数,而是基于用户定义的高度。您可以在这里找到答案:
如果希望发生这种行为,很简单:
这与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
}
}
}
}