为什么UITextView没有内置占位符以及如何解决
\n\n每个iOS开发者,只要曾经使用过UITextView,都会遇到同样的问题:与UITextField不同,UITextView没有内置的placeholder属性。您创建一个多行文本输入框,运行应用程序——然后看到一个空白的白色矩形。用户不知道应该输入什么,而设计师则感到不满。
为什么Apple没有添加这个属性?从历史上看,UITextView被定位为用于显示和编辑大量文本(例如笔记或邮件)的元素,而不是带有提示的输入字段。但时代变了:今天我们将UITextView用于评论、描述、个人简介——任何需要占位符的地方。
在本文中,我们将介绍3种经过验证的方法,在Swift中为UITextView添加占位符文本。您将了解如何通过UILabel、通过NSAttributedString属性以及通过创建自定义子类来实现。开始吧!
方法1:经典的UILabel覆盖在UITextView之上
\n\n最简单且最直观的方法是将UILabel放置在UITextView之上,并控制其可见性。这种方法非常适合初学者以及不需要复杂自定义的项目。
工作原理
\n\n您将UILabel添加为UITextView的子视图,设置其占位符文本,并在用户开始输入时隐藏它。以下是分步示例:
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelegate {\n \n @IBOutlet weak var textView: UITextView!\n let placeholderLabel = UILabel()\n \n override func viewDidLoad() {\n super.viewDidLoad()\n textView.delegate = self\n setupPlaceholder()\n }\n \n func setupPlaceholder() {\n placeholderLabel.text = "请输入您的评论..."\n placeholderLabel.font = UIFont.systemFont(ofSize: 16)\n placeholderLabel.textColor = UIColor.lightGray\n placeholderLabel.translatesAutoresizingMaskIntoConstraints = false\n textView.addSubview(placeholderLabel)\n \n NSLayoutConstraint.activate([\n placeholderLabel.topAnchor.constraint(equalTo: textView.topAnchor, constant: 8),\n placeholderLabel.leadingAnchor.constraint(equalTo: textView.leadingAnchor, constant: 5),\n placeholderLabel.trailingAnchor.constraint(equalTo: textView.trailingAnchor, constant: -5)\n ])\n }\n \n func textViewDidChange(_ textView: UITextView) {\n placeholderLabel.isHidden = !textView.text.isEmpty\n }\n}\n\n重要提示:不要忘记设置UITextViewDelegate委托并实现textViewDidChange方法。如果您使用SwiftUI,方法会有所不同——那里使用.overlay修饰符。
优点和缺点
\n- \n
- 优点:简单易懂,适用于任何iOS版本。 \n
- 缺点:如果textview的insets发生变化,需要关注约束。此外,如果textview具有不同对齐方式的
NSAttributedString,则此方法无效。 \n
方法2:通过NSAttributedString实现占位符
\n\n更优雅的方法是使用字符串属性。其思路是将占位符显示为属性文本,颜色为灰色,当用户开始输入时,将其替换为普通文本。
\n\n如果您在Swift中使用UITextView并且不想为额外的视图而烦恼,这种方法特别有用。
\n\n实现
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextViewDelega