411 Stimmen

Füge Platzhaltertext in UITextView in Swift ein?

Wie kann ich einen Platzhalter in einem UITextView hinzufügen, ähnlich wie bei UITextField, in Swift?

0voto

Srinivasan.M Punkte 257
var placeholderLabel: UILabel!
  textviewDescription.delegate = self
    placeholderLabel = UILabel()
    placeholderLabel.text = "Eine Beschreibung hinzufügen"

   func textViewDidChange(_ textView: UITextView) {
             placeholderLabel.isHidden = !textviewDescription.text.isEmpty
    }

0voto

atultw Punkte 832

Ich fand die Ausrichtung des UILabel in anderen Lösungen als zickig, daher hier eine Lösung unter Verwendung eines zweiten UITextView:

        textView.isEditable = true
        textView.isSelectable = true
        textView.isUserInteractionEnabled = true

        placeholderLabel.backgroundColor = .clear
        placeholderLabel.textColor = .tertiaryLabel
        placeholderLabel.text = "Platzhalter"

        // Das ist wichtig:
        placeholderLabel.isEditable = false
        placeholderLabel.isUserInteractionEnabled = false

        textView.addSubview(placeholderLabel)

        // isHidden im Delegate nach Bedarf aktualisieren
        placeholderLabel.isHidden = !textView.text.isEmpty

Stellen Sie sicher, dass Schriftart und textContainerInset auf beiden UITextViews gleich sind, dann passt es perfekt zusammen.

0voto

vedrano Punkte 2911

Möglicherweise die einfachste Out-of-the-Box-Lösung für die Implementierung eines UITextView-Platzhalters, die nicht unter folgenden Problemen leidet:

  • Verwendung von UILabel anstelle von UITextView, was sich möglicherweise anders verhält
  • Wechseln zu und von dem Platzhalter 'UITextView'-Kopie, die das erste eingegebene Zeichen erfassen würde, das im Hauptsteuerelement UITextView fehlen würde
  • Spielen mit dem Haupttextinhalt der UITextView-Steuerungen text durch Ersetzung des Platzhalters durch einen leeren String oder das erste eingegebene Zeichen. Der Grenzfall ist, dass wenn der Benutzer den Platzhalter-Text eingibt, einige vorgeschlagene Implementierungen ihn als Platzhalter selbst behandeln würden.

Swift 5:

import UIKit
import SnapKit
import RxSwift
import RxCocoa

class TextAreaView: UIView {
    let textArea = UITextView()
    let textAreaPlaceholder = UITextView()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonSetup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonSetup()
    }

    private func commonSetup() {

        addSubview(textAreaPlaceholder)
        addSubview(textArea)

        textArea.isScrollEnabled = false
        textArea.delegate = self

        textAreaPlaceholder.isScrollEnabled = false
        textAreaPlaceholder.textColor = UIColor.lightGray

        textArea.snp.makeConstraints { make in
            make.top.bottom.leading.trailing.equalToSuperview()
        }

        textAreaPlaceholder.snp.makeConstraints { make in
            make.top.bottom.leading.trailing.equalTo(textArea.snp.top)
        }

        textAreaPlaceholder.text = "Platzhalter"

        updatePlaceholder()
    }

    func updatePlaceholder() {
        if textArea.text.count > 0 {
            textArea.alpha = 1.0
        } else {
            textArea.alpha = 0.0
        }
    }
}

extension TextAreaView: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        updatePlaceholder()
    }
}

0voto

Andrew Ehab Punkte 1
import UIKit
import RxSwift

@IBDesignable class TextViewWithPlaceholder: UITextView {

    //MARK: - Eigenschaften
    @IBInspectable var placeholderText: String = ""

    let placeholderLabel = LocalizedUILabel()
    private let hidePlaceholderObserver = PublishSubject()
    let disposeBag = DisposeBag()

    //MARK: - Wurde in das Fenster verschoben
    override func didMoveToWindow() {
        super.didMoveToWindow()
        observeOnTextViewEditing()
        configurePlaceholder()
    }

    //MARK: - Auf Textansichtsänderungen beobachten
    private func observeOnTextViewEditing() {
        rx.text.subscribe(onNext: { [weak self] selectedText in
            guard let self = self else { return }
            self.hidePlaceholderObserver.onNext((selectedText?.isEmpty ?? true) ? false : true)

        }).disposed(by: disposeBag)
    }

    //MARK: - Platzhalter anzeigen/ausblenden beobachten
    private func configurePlaceholder() {
        hidePlaceholderObserver
            .bind(to: placeholderLabel.rx.isHidden)
            .disposed(by: disposeBag)

        placeholderLabel.text = placeholderText
        placeholderLabel.font = UIFont(name: "Poppins-Semibold", size: 16) ?? UIFont()
        placeholderLabel.textColor = .lightGray

        placeholderLabel.sizeToFit()
        placeholderLabel.frame.origin = CGPoint(x: 8, y: 8)
        addSubview(placeholderLabel)
    }

}

0voto

arvinq Punkte 506

Dies ist, was ich getan habe. Ich tendiere zu Code-Klarheit und Einfachheit. Ich musste eine textView hinzufügen, die einige zusätzliche Notizen in meiner App erhält. Diese zusätzlichen Notizen können erstellt oder nach dem Speichern geändert werden. Siehe unten. HTH. :)

class NotesTextView: UITextView {

    var placeholder = "" {
        didSet {
            showPlaceholder()
        }
    }

    // Wenn der Text der Platzhalter ist, weisen Sie ihm eine für einen Platzhaltertext geeignete Farbe zu, andernfalls weisen Sie ihm Ihre Farbe nach Wahl zu.
    override var text: String! {
        didSet {
            textColor = text == placeholder ? .tertiaryLabel : .systemBlue
        }
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)

        delegate = self
        // Konfigurieren Sie hier Ihre Schriftart und translateAutoResizingMaskIntoConstraints
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) wurde nicht implementiert")
    }

    private func showPlaceholder() {
        text = placeholder
    }

    private func hidePlaceholder() {
        text = ""
    }
}

extension NotesTextView: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) {
        if text == placeholder {
            hidePlaceholder()
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        if text.isEmpty {
            showPlaceholder()
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X