iOS仿微信聊天输入框、评论输入框
iOS仿微信聊天输入框、评论输入框
最近项目有需求,需要实现一个类似微信聊天输入框的组件,用在全平台的评论功能中。大概需求就是输入的文字占满一行时,自动折行并且增大输入框的高,输入框的高有默认的最大值。在此,记录一下遇到的问题。
1. 输入框的高度自适应
首先,我们需要实现输入框的高度自适应。我们可以使用 `UITextView` 来实现这个功能。具体步骤如下:
* 创建一个 `UITextView` 的实例,并设置其 `delegate` 为当前控制器。
* 在 `textViewDidChange:` 方法中,获取当前输入框的高度和内容。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftclass ChatInputView: UIView {
let textView = UITextView()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupUI() {
addSubview(textView)
textView.delegate = self textView.backgroundColor = .white textView.font = UIFont.systemFont(ofSize:14)
textView.layer.cornerRadius =5 let maxHeight =200 textView.heightAnchor.constraint(equalToConstant: maxHeight).isActive = true }
func textViewDidChange(_ textView: UITextView) {
guard let text = textView.text else { return }
if text.count >0 && textView.contentSize.height < maxHeight {
textView.heightAnchor.constraint(equalToConstant: max(min(textView.contentSize.height, maxHeight),44)).isActive = true layoutIfNeeded()
} else {
textView.heightAnchor.constraint(equalToConstant:44).isActive = true layoutIfNeeded()
}
}
}
extension ChatInputView: UITextViewDelegate {}
```
2. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在视图上。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let text = textView.text ?? ""
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttributes([.font: UIFont.systemFont(ofSize:14)], range: NSRange(location:0, length: text.count))
let label = UILabel()
label.attributedText = attributedText label.frame = CGRect(x:10, y:10, width: textView.bounds.width -20, height: textView.contentSize.height)
addSubview(label)
}
```
3. 输入框的高度自适应
在 `textViewDidChange:` 方法中,我们需要将输入框的高度自适应。具体步骤如下:
* 获取当前输入框的高度。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let height = max(min(textView.contentSize.height, maxHeight),44)
textView.heightAnchor.constraint(equalToConstant: height).isActive = true layoutIfNeeded()
}
```
4. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在视图上。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let text = textView.text ?? ""
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttributes([.font: UIFont.systemFont(ofSize:14)], range: NSRange(location:0, length: text.count))
let label = UILabel()
label.attributedText = attributedText label.frame = CGRect(x:10, y:10, width: textView.bounds.width -20, height: textView.contentSize.height)
addSubview(label)
}
```
5. 输入框的高度自适应
在 `textViewDidChange:` 方法中,我们需要将输入框的高度自适应。具体步骤如下:
* 获取当前输入框的高度。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let height = max(min(textView.contentSize.height, maxHeight),44)
textView.heightAnchor.constraint(equalToConstant: height).isActive = true layoutIfNeeded()
}
```
6. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在视图上。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let text = textView.text ?? ""
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttributes([.font: UIFont.systemFont(ofSize:14)], range: NSRange(location:0, length: text.count))
let label = UILabel()
label.attributedText = attributedText label.frame = CGRect(x:10, y:10, width: textView.bounds.width -20, height: textView.contentSize.height)
addSubview(label)
}
```
7. 输入框的高度自适应
在 `textViewDidChange:` 方法中,我们需要将输入框的高度自适应。具体步骤如下:
* 获取当前输入框的高度。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let height = max(min(textView.contentSize.height, maxHeight),44)
textView.heightAnchor.constraint(equalToConstant: height).isActive = true layoutIfNeeded()
}
```
8. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在视图上。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let text = textView.text ?? ""
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttributes([.font: UIFont.systemFont(ofSize:14)], range: NSRange(location:0, length: text.count))
let label = UILabel()
label.attributedText = attributedText label.frame = CGRect(x:10, y:10, width: textView.bounds.width -20, height: textView.contentSize.height)
addSubview(label)
}
```
9. 输入框的高度自适应
在 `textViewDidChange:` 方法中,我们需要将输入框的高度自适应。具体步骤如下:
* 获取当前输入框的高度。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let height = max(min(textView.contentSize.height, maxHeight),44)
textView.heightAnchor.constraint(equalToConstant: height).isActive = true layoutIfNeeded()
}
```
10. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在视图上。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let text = textView.text ?? ""
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttributes([.font: UIFont.systemFont(ofSize:14)], range: NSRange(location:0, length: text.count))
let label = UILabel()
label.attributedText = attributedText label.frame = CGRect(x:10, y:10, width: textView.bounds.width -20, height: textView.contentSize.height)
addSubview(label)
}
```
11. 输入框的高度自适应
在 `textViewDidChange:` 方法中,我们需要将输入框的高度自适应。具体步骤如下:
* 获取当前输入框的高度。
* 如果输入框的高度小于最大值(假设为200),则增加输入框的高度并重新布局子视图。
```swiftfunc textViewDidChange(_ textView: UITextView) {
// ...
let height = max(min(textView.contentSize.height, maxHeight),44)
textView.heightAnchor.constraint(equalToConstant: height).isActive = true layoutIfNeeded()
}
```
12. 输入框的内容回显
在 `textViewDidChange:` 方法中,我们需要将输入框的内容回显到视图上。具体步骤如下:
* 获取当前输入框的内容。
* 将内容显示在
聊天评论仿微信输入框聊天输入框评论输入框UITextView自动增加行高textContainerInset和textContain