Wie kann ich einen Platzhalter in einem UITextView
hinzufügen, ähnlich wie bei UITextField
, in Swift
?
Antworten
Zu viele Anzeigen?Ich habe dies gemacht, indem ich zwei verschiedene Textansichten verwendet habe:
- Eine im Hintergrund, die als Platzhalter verwendet wird.
- Eine im Vordergrund (mit transparentem Hintergrund), in die der Benutzer tatsächlich eingibt.
Die Idee ist, dass sobald der Benutzer anfängt, etwas in die Vordergrundansicht einzugeben, der Platzhalter in der Hintergrundansicht verschwindet (und wieder erscheint, wenn der Benutzer alles löscht). Es verhält sich also genau wie ein Platzhalter für das Eingabefeld für einzeiligen Text.
Hier ist der Code, den ich dafür verwendet habe. Beachten Sie, dass descriptionField das Feld ist, in das der Benutzer eingibt und descriptionPlaceholder dasjenige im Hintergrund ist.
func textViewDidChange(descriptionField: UITextView) {
if descriptionField.text.isEmpty == false {
descriptionPlaceholder.text = ""
} else {
descriptionPlaceholder.text = descriptionPlaceholderText
}
}
Swift:
Fügen Sie Ihr TextView
@IBOutlet
hinzu:
@IBOutlet weak var txtViewMessage: UITextView!
Fügen Sie in der Methode viewWillAppear
folgendes hinzu:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
txtViewMessage.delegate = self // Geben Sie TextViewMessage delegat Methode
txtViewMessage.text = "Platzhaltername"
txtViewMessage.textColor = UIColor.lightGray
}
Fügen Sie bitte den Delegate
mithilfe der Erweiterung (UITextViewDelegate) hinzu:
// MARK: - UITextViewDelegate
extension ViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
if !txtViewMessage.text!.isEmpty && txtViewMessage.text! == "Platzhaltername" {
txtViewMessage.text = ""
txtViewMessage.textColor = UIColor.black
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if txtViewMessage.text.isEmpty {
txtViewMessage.text = "Platzhaltername"
txtViewMessage.textColor = UIColor.lightGray
}
}
}
Ich habe versucht, den Code bequem von clearlight's Antwort zu machen.
extension UITextView{
func setPlaceholder() {
let placeholderLabel = UILabel()
placeholderLabel.text = "Geben Sie etwas Text ein..."
placeholderLabel.font = UIFont.italicSystemFont(ofSize: (self.font?.pointSize)!)
placeholderLabel.sizeToFit()
placeholderLabel.tag = 222
placeholderLabel.frame.origin = CGPoint(x: 5, y: (self.font?.pointSize)! / 2)
placeholderLabel.textColor = UIColor.lightGray
placeholderLabel.isHidden = !self.text.isEmpty
self.addSubview(placeholderLabel)
}
func checkPlaceholder() {
let placeholderLabel = self.viewWithTag(222) as! UILabel
placeholderLabel.isHidden = !self.text.isEmpty
}
}
Verwendung
override func viewDidLoad() {
textView.delegate = self
textView.setPlaceholder()
}
func textViewDidChange(_ textView: UITextView) {
textView.checkPlaceholder()
}
Hier ist, was ich für die Erledigung dieser Aufgabe verwende.
@IBDesignable Klasse UIPlaceholderTextView: UITextView {
var placeholderLabel: UILabel?
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
sharedInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
sharedInit()
}
override func prepareForInterfaceBuilder() {
sharedInit()
}
func sharedInit() {
refreshPlaceholder()
NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: UITextView.textDidChangeNotification, object: nil)
}
@IBInspectable var placeholder: String? {
didSet {
refreshPlaceholder()
}
}
@IBInspectable var placeholderColor: UIColor? = .darkGray {
didSet {
refreshPlaceholder()
}
}
@IBInspectable var placeholderFontSize: CGFloat = 14 {
didSet {
refreshPlaceholder()
}
}
func refreshPlaceholder() {
if placeholderLabel == nil {
placeholderLabel = UILabel()
let contentView = self.subviews.first ?? self
contentView.addSubview(placeholderLabel!)
placeholderLabel?.translatesAutoresizingMaskIntoConstraints = false
placeholderLabel?.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: textContainerInset.left + 4).isActive = true
placeholderLabel?.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: textContainerInset.right + 4).isActive = true
placeholderLabel?.topAnchor.constraint(equalTo: contentView.topAnchor, constant: textContainerInset.top).isActive = true
placeholderLabel?.bottomAnchor.constraint(lessThanOrEqualTo: contentView.bottomAnchor, constant: textContainerInset.bottom).isActive = true
}
placeholderLabel?.text = placeholder
placeholderLabel?.textColor = placeholderColor
placeholderLabel?.font = UIFont.systemFont(ofSize: placeholderFontSize)
}
@objc func textChanged() {
if self.placeholder?.isEmpty ?? true {
return
}
UIView.animate(withDuration: 0.25) {
if self.text.isEmpty {
self.placeholderLabel?.alpha = 1.0
} else {
self.placeholderLabel?.alpha = 0.0
}
}
}
override var text: String! {
didSet {
textChanged()
}
}
}
Ich weiß, dass es mehrere ähnliche Ansätze gibt, aber die Vorteile dieses sind, dass es Folgendes kann:
- Platzhaltertext, Schriftgröße und Farbe in IB festlegen.
- Zeigt in IB nicht mehr die Warnung "Scroll View has ambiguous scrollable content".
- Animation für Ein-/Ausblenden des Platzhalters hinzufügen.
Wert im Ansichtsladen setzen
txtVw!.autocorrectionType = UITextAutocorrectionType.No
txtVw!.text = "Schreiben Sie Ihren Platzhalter"
txtVw!.textColor = UIColor.lightGrayColor()
func textViewDidBeginEditing(textView: UITextView) {
if (txtVw?.text == "Schreiben Sie Ihren Platzhalter")
{
txtVw!.text = nil
txtVw!.textColor = UIColor.blackColor()
}
}
func textViewDidEndEditing(textView: UITextView) {
if txtVw!.text.isEmpty
{
txtVw!.text = "Schreiben Sie Ihren Platzhalter"
txtVw!.textColor = UIColor.lightGrayColor()
}
textView.resignFirstResponder()
}