754 Stimmen

Platzhalter in UITextView

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?

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

24 Stimmen

Wie wäre es mit der Kategorie UITextView+Placeholder? github.com/devxoul/UITextView-Platzhalter

5voto

vatti Punkte 455
    - (void)textViewDidChange:(UITextView *)textView
{
    placeholderLabel.hidden = YES;
}

eine Beschriftung über die Textansicht legen.

0 Stimmen

Oder noch besser: Sie können sie wieder anzeigen, wenn kein Text vorhanden ist: lblPlaceholder.hidden = ![textView.text isEqualToString:@""];

0 Stimmen

Ich mag diese saubere Lösung, keine Injektion in die Textansicht selbst.

4voto

Shivang Garg Punkte 71

Ich habe eine Swift-3-Version von höchstrangige Antwort

Sie müssen nur UITextView subclassing tun.

import UIKit

 class UIPlaceHolderTextView: UITextView {

//MARK: - Properties
@IBInspectable var placeholder: String?
@IBInspectable var placeholderColor: UIColor?
var placeholderLabel: UILabel?

//MARK: - Initializers
override func awakeFromNib() {
    super.awakeFromNib()

}

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

    // Use Interface Builder User Defined Runtime Attributes to set
    // placeholder and placeholderColor in Interface Builder.
    if self.placeholder == nil {
        self.placeholder = ""
    }

    if self.placeholderColor == nil {
        self.placeholderColor = UIColor.black
    }

    NotificationCenter.default.addObserver(self, selector: #selector(textChanged(_:)), name: NSNotification.Name.UITextViewTextDidChange, object: nil)

}

func textChanged(_ notification: Notification) -> Void {
    if self.placeholder?.count == 0 {
        return
    }

    UIView.animate(withDuration: 0.25) {
        if self.text.count == 0 {
            self.viewWithTag(999)?.alpha = 1
        }
        else {
            self.viewWithTag(999)?.alpha = 0
        }
    }
}

// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
    super.draw(rect)

    if (self.placeholder?.count ?? 0) > 0 {
        if placeholderLabel == nil {
            placeholderLabel = UILabel.init()
            placeholderLabel?.lineBreakMode = .byWordWrapping
            placeholderLabel?.numberOfLines = 0
            placeholderLabel?.font = self.font
            placeholderLabel?.backgroundColor = self.backgroundColor
            placeholderLabel?.textColor = self.placeholderColor
            placeholderLabel?.alpha = 0
            placeholderLabel?.tag = 999
            self.addSubview(placeholderLabel!)

            placeholderLabel?.translatesAutoresizingMaskIntoConstraints = false
            placeholderLabel?.topAnchor.constraint(equalTo: self.topAnchor, constant: 7).isActive = true
            placeholderLabel?.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 4).isActive = true
            placeholderLabel?.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
            placeholderLabel?.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
        }

        placeholderLabel?.text = self.placeholder
        placeholderLabel?.sizeToFit()
        self.sendSubview(toBack: self.placeholderLabel!)
    }

    if self.text.count == 0 && (self.placeholder?.count ?? 0) > 0 {
        self.viewWithTag(999)?.alpha = 1
    }
 }
}

0 Stimmen

Der Platzhalter wird überhaupt nicht angezeigt. Ich verwende Swift 5. Irgendwelche Ideen?

4voto

Granfalloner Punkte 404

Werfen Sie einen Blick auf UTPlaceholderTextView .

Dies ist eine praktische Unterklasse von UITextView, die Platzhalter unterstützt, die denen von UITextField ähneln. Wichtigste Eigenheiten:

  • Verwendet keine Unteransichten
  • Überschreibt nicht drawRect:
  • Der Platzhalter kann eine beliebige Länge haben und wird genauso dargestellt wie der normale Text.

4voto

Chris Punkte 21

Hier ist eine weitere Möglichkeit, die die leichte Einkerbung von UITextField Platzhalter:

Ziehen Sie eine UITextField direkt unter dem UITextView so, dass ihre oberen linken Ecken aufeinander ausgerichtet sind. Fügen Sie Ihren Platzhaltertext in das Textfeld ein.

In viewDidLoad, hinzufügen:

[tView setDelegate:self];
tView.contentInset = UIEdgeInsetsMake(-8,-8,0,0);
tView.backgroundColor = [UIColor clearColor];

Dann fügen Sie hinzu:

- (void)textViewDidChange:(UITextView *)textView {
    if (textView.text.length == 0) {
        textView.backgroundColor = [UIColor clearColor];            
    } else {
        textView.backgroundColor = [UIColor whiteColor];
    }
}

4voto

P. Ent Punkte 1322

Ich habe sie alle durchgelesen, aber ich habe eine sehr kurze Lösung in Swift 3 gefunden, die in allen meinen Tests funktioniert hat. Es könnte ein wenig mehr Allgemeinheit stehen, aber der Prozess ist einfach. Hier ist die ganze Sache, die ich "TextViewWithPlaceholder" nennen.

import UIKit

class TextViewWithPlaceholder: UITextView {

    public var placeholder: String?
    public var placeholderColor = UIColor.lightGray

    private var placeholderLabel: UILabel?

    // Set up notification listener when created from a XIB or storyboard.
    // You can also set up init() functions if you plan on creating
    // these programmatically.
    override func awakeFromNib() {
        super.awakeFromNib()

        NotificationCenter.default.addObserver(self,
                                           selector: #selector(TextViewWithPlaceholder.textDidChangeHandler(notification:)),
                                           name: .UITextViewTextDidChange,
                                           object: self)

        placeholderLabel = UILabel()
        placeholderLabel?.alpha = 0.85
        placeholderLabel?.textColor = placeholderColor
    }

    // By using layoutSubviews, you can size and position the placeholder
    // more accurately. I chose to hard-code the size of the placeholder
    // but you can combine this with other techniques shown in previous replies.
    override func layoutSubviews() {
        super.layoutSubviews()

        placeholderLabel?.textColor = placeholderColor
        placeholderLabel?.text = placeholder

        placeholderLabel?.frame = CGRect(x: 6, y: 4, width: self.bounds.size.width-16, height: 24)

        if text.isEmpty {
            addSubview(placeholderLabel!)
            bringSubview(toFront: placeholderLabel!)
        } else {
            placeholderLabel?.removeFromSuperview()
        }
    }

    // Whenever the text changes, just trigger a new layout pass.
    func textDidChangeHandler(notification: Notification) {
        layoutSubviews()
    }
}

0 Stimmen

Hier einige Bedenken. Sie sollten nicht anrufen layoutSubviews() direkt. Und Sie haben den NotificationCenter-Beobachter nicht entfernt.

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