Meine Anwendung verwendet ein UITextView
. Jetzt möchte ich die UITextView
einen Platzhalter zu haben, der dem Platzhalter ähnelt, den Sie für eine UITextField
.
Wie kann man das tun?
Meine Anwendung verwendet ein UITextView
. Jetzt möchte ich die UITextView
einen Platzhalter zu haben, der dem Platzhalter ähnelt, den Sie für eine UITextField
.
Wie kann man das tun?
Eine weitere Antwort:
https://github.com/gcamp/GCPlaceholderTextView
Ändern Klasse von UITextView
in IB an GCPlaceholderTextView
und setzen Sie die placeholder
Eigenschaft
Jasons Antwort sieht in iOS7 ein bisschen daneben aus, beheben Sie es, indem Sie den Offset von _placeHolderLabel anpassen:
- (void)drawRect:(CGRect)rect
{
if( [[self placeholder] length] > 0 )
{
if (_placeHolderLabel == nil )
{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7)
_placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(4,8,self.bounds.size.width - 8,0)];
else
_placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
_placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
_placeHolderLabel.numberOfLines = 0;
_placeHolderLabel.font = self.font;
_placeHolderLabel.backgroundColor = [UIColor clearColor];
_placeHolderLabel.textColor = self.placeholderColor;
_placeHolderLabel.alpha = 0;
_placeHolderLabel.tag = 999;
[self addSubview:_placeHolderLabel];
}
_placeHolderLabel.text = self.placeholder;
[_placeHolderLabel sizeToFit];
[self sendSubviewToBack:_placeHolderLabel];
}
if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
{
[[self viewWithTag:999] setAlpha:1];
}
[super drawRect:rect];
}
Dies ist meine Version von UITextView mit Platzhalter-Unterstützung. Swift 4.2 https://gist.github.com/hlung/c5dda3a0c2087e5ae6c1fce8822c4713
Eine UITextView-Unterklasse mit Platzhaltertext-Unterstützung. Sie verwendet ein anderes UILabel, um den Platzhalter anzuzeigen, der angezeigt wird, wenn der Text leer ist.
In Swift 5. Funktioniert gut.
class BaseTextView: UITextView {
// MARK: - Views
private var placeholderLabel: UIlabel!
// MARK: - Init
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
setupUI()
startupSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupUI()
startupSetup()
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
// MARK: - Setup UI
private extension BaseTextView {
func setupUI() {
addPlaceholderLabel()
textColor = .textColor
}
func addPlaceholderLabel() {
placeholderLabel = BaseLabel(frame: .zero)
placeholderLabel.translatesAutoresizingMaskIntoConstraints = false
insertSubview(placeholderLabel, at: 0)
placeholderLabel.alpha = 0
placeholderLabel.numberOfLines = 0
placeholderLabel.backgroundColor = .clear
placeholderLabel.textColor = .lightTextColor
placeholderLabel.lineBreakMode = .byWordWrapping
placeholderLabel.isUserInteractionEnabled = false
placeholderLabel.font = UIFont.openSansSemibold.withSize(12)
placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: 8).isActive = true
placeholderLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true
placeholderLabel.rightAnchor.constraint(lessThanOrEqualTo: rightAnchor, constant: -8).isActive = true
placeholderLabel.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor, constant: -8).isActive = true
}
}
// MARK: - Startup
private extension BaseTextView {
func startupSetup() {
addObservers()
textChanged(nil)
font = UIFont.openSansSemibold.withSize(12)
}
func addObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(textChanged(_:)), name: UITextView.textDidChangeNotification, object: nil)
}
}
// MARK: - Actions
private extension BaseTextView {
@objc func textChanged(_ sender: Notification?) {
UIView.animate(withDuration: 0.2) {
self.placeholderLabel.alpha = self.text.count == 0 ? 1 : 0
}
}
}
// MARK: - Public methods
extension BaseTextView {
public func setPlaceholder(_ placeholder: String) {
placeholderLabel.text = placeholder
}
}
Nachdem ich alle Antworten durchgegangen bin, wurde mir klar, dass ich etwas Einfaches brauche, das gleichzeitig wiederverwendbar ist, so dass ich dieselbe Funktionalität zu allen Anwendungen hinzufügen kann. UITextViews
in meinem Projekt. Am Ende habe ich den folgenden Code erhalten:
extension UITextView {
// MARK: TextView PlaceHolderLabel Setup
func createPlaceHolderLabel(with text: String) {
let lbl = UILabel()
self.addSubview(lbl)
// Add your constraints here
lbl.text = text
lbl.textColor = .lightGray
}
// My Textview contains only one UILabel, and for my use case the below code works, tweak it according to your use case
// Lastly two methods to toggle between show and hide the placeholder label
func hidePlaceHolderLabel() {
guard let lbl = self.subviews.first(where: { $0 is UILabel }) else { return }
lbl.isHidden = true
}
func showPlaceHolderLabel() {
guard let lbl = self.subviews.first(where: { $0 is UILabel }) else { return }
lbl.isHidden = false
}
}
Wenn UILabel
wird als SubView hinzugefügt zu UITextView
, textView Cursorposition und UILabel
Position nicht übereinstimmt, lassen Sie deshalb ein Leerzeichen vor dem Platzhaltertext
class ViewController: UIViewController, UITextViewDelegate {
var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textView)
// Also setup textView constraints as per your need
// Add placeholder to your textView
// Leave one space before placeholder string
textView.createPlaceHolderLabel(with: " Address")
textView.delegate = self
}
Dann in textViewdidChange
Methode den folgenden Code einfügen
func textViewDidChange(_ textView: UITextView) {
if textView.text.isEmpty {
textView.showPlaceHolderLabel()
} else {
textView.hidePlaceHolderLabel()
}
}
Es kann in allen Bereichen wiederverwendet werden UITextViews
.
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.
0 Stimmen
Der TTTextEditor von Three20 (der seinerseits UITextField verwendet) unterstützt sowohl Platzhaltertext als auch das Wachsen nach Höhe (er wird zu einem UITextView).
0 Stimmen
Hier ist eine kleine und geniale Lösung für dieses Problem
24 Stimmen
Wie wäre es mit der Kategorie UITextView+Placeholder? github.com/devxoul/UITextView-Platzhalter
2 Stimmen
Ich bevorzuge die Lösung von @devxoul, da sie Kategorie und nicht Unterklasse verwendet. Außerdem erzeugt sie ein Feld für "Platzhalter"-Optionen (Platzhaltertext und Textfarbe) in IBs Inspektor. Sie verwendet einige Bindungstechniken. Was für ein toller Code
0 Stimmen
Wenn Sie Folgendes verwenden
UITextView
wird die Lösung ganz anders aussehen. Hier sind ein paar Lösungen. Schwebender Platzhalter y Gefälschte Native Platzhalter0 Stimmen
Versuchen Sie diese Antwort :) [_textView setTextColor:[UIColor lightGrayColor]];
0 Stimmen
@ICoffeeConsumer Interessant ist, dass die native iOS-Kalender-App mehrzeiligen editierbaren Text hat - mit einem Platzhalter (Hinzufügen von "Notizen" zu einem Ereignis). Es gibt also einen direkten Beweis dafür, dass Apple selbst die Notwendigkeit/Nutzung dafür erkennt.