教你实现 iOS UITextView 高度随输入内容变化

在iOS开发中,UITextView是一个常用的多行文本输入控件。在使用时,可能会遇到这样的需求:根据用户输入的内容,动态调整UITextView的高度。本文将教你如何实现这一功能,我们将分步骤进行讲解,并附上完整的代码和示意图。

实现流程

下面是实现UITextView高度自动调整的步骤:

步骤 描述
1 创建UITextView并设置基本属性
2 使UITextView的代理方法可用
3 在代理方法中计算内容高度
4 更新UITextView的高度
5 测试并调整

详细步骤

第一段:创建UITextView

我们首先需要在视图控制器中创建一个UITextView,并设置其基本属性。

class ViewController: UIViewController {

    let textView: UITextView = {
        let tv = UITextView()
        tv.backgroundColor = .lightGray // 设置背景色
        tv.font = UIFont.systemFont(ofSize: 16) // 设置字体大小
        tv.translatesAutoresizingMaskIntoConstraints = false // 使用自动布局
        return tv
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTextView() // 调用设置UITextView的方法
    }

    func setupTextView() { 
        view.addSubview(textView) // 将UITextView添加到视图中
        textView.delegate = self // 设置代理
        // 设置UITextView的约束
        NSLayoutConstraint.activate([
            textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
            textView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
            textView.heightAnchor.constraint(greaterThanOrEqualToConstant: 40)
        ])
    }
}

第二段:使UITextView的代理方法可用

要让UITextView能够响应用户的输入,我们得实现UITextViewDelegate协议,并在文本改变时作出反应。

extension ViewController: UITextViewDelegate { 
    func textViewDidChange(_ textView: UITextView) {
        updateTextViewHeight() // 每次文本更改时更新高度
    }
}

第三段:计算内容高度

我们需要创建一个方法用来计算UITextView的内容高度。

func updateTextViewHeight() { 
    let size = textView.sizeThatFits(CGSize(width: textView.frame.width, height: CGFloat.greatestFiniteMagnitude)) // 计算内容的尺寸
    textView.snp.updateConstraints { make in // 使用SnapKit更新约束
        make.height.equalTo(size.height) // 设置高度等于计算得出的高度
    }
    view.layoutIfNeeded() // 更新界面布局
}

第四段:更新UITextView的高度

textViewDidChange中调用updateTextViewHeight,通过计算得到的高度来更新UITextView的显示。

func updateTextViewHeight() { 
    let size = textView.sizeThatFits(CGSize(width: textView.frame.width, height: CGFloat.greatestFiniteMagnitude)) // 计算内容的尺寸
    textView.heightAnchor.constraint(equalToConstant: size.height).isActive = true // 设置高度约束
    view.layoutIfNeeded() // 更新界面布局
}

第五段:测试并调整

在完成功能后,运行你的应用程序并适当输入内容,确保UITextView的高度随着文本的增加而增加。

类图和甘特图

甘特图

gantt
    title iOS UITextView 自动高度实现
    dateFormat  YYYY-MM-DD
    section 创建UITextView
    创建UITextView           :a1, 2023-10-01, 1d
    section 设置代理
    设置UITextView代理      :a2, 2023-10-02, 1d
    section 计算高度
    计算内容高度          :a3, 2023-10-03, 2d
    section 更新高度
    更新UITextView高度      :a4, 2023-10-05, 1d
    section 测试和调整
    测试功能                 :a5, 2023-10-06, 1d

类图

classDiagram
    class ViewController {
        +UITextView textView
        +setupTextView()
        +updateTextViewHeight()
    }

总结

通过上述步骤,我们成功实现了UITextView高度的动态调整。此功能不仅提升了用户体验,还让你的应用变得更为人性化。如果你还有任何疑问或疑惑,欢迎自由提问!希望这篇文章能帮助你成为更出色的开发者!