Wie kann ich einen Platzhalter in einem UITextView
hinzufügen, ähnlich wie bei UITextField
, in Swift
?
Antworten
Zu viele Anzeigen?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 UITextView
s gleich sind, dann passt es perfekt zusammen.
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 vonUITextView
, 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()
}
}
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)
}
}
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()
}
}
}