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?
Hier ist der Code für swift 3.1
Originalcode von Jason George in der ersten Antwort.
Vergessen Sie nicht, Ihre benutzerdefinierte Klasse für TextView im Interface Builder auf UIPlaceHolderTextView zu setzen und dann die Eigenschaften placeholder und placeHolder festzulegen.
import UIKit
@IBDesignable
class UIPlaceHolderTextView: UITextView {
@IBInspectable var placeholder: String = ""
@IBInspectable var placeholderColor: UIColor = UIColor.lightGray
private let uiPlaceholderTextChangedAnimationDuration: Double = 0.05
private let defaultTagValue = 999
private var placeHolderLabel: UILabel?
override func awakeFromNib() {
super.awakeFromNib()
NotificationCenter.default.addObserver(
self,
selector: #selector(textChanged),
name: NSNotification.Name.UITextViewTextDidChange,
object: nil
)
}
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
NotificationCenter.default.addObserver(
self,
selector: #selector(textChanged),
name: NSNotification.Name.UITextViewTextDidChange,
object: nil
)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NotificationCenter.default.addObserver(
self,
selector: #selector(textChanged),
name: NSNotification.Name.UITextViewTextDidChange,
object: nil
)
}
deinit {
NotificationCenter.default.removeObserver(
self,
name: NSNotification.Name.UITextViewTextDidChange,
object: nil
)
}
@objc private func textChanged() {
guard !placeholder.isEmpty else {
return
}
UIView.animate(withDuration: uiPlaceholderTextChangedAnimationDuration) {
if self.text.isEmpty {
self.viewWithTag(self.defaultTagValue)?.alpha = CGFloat(1.0)
}
else {
self.viewWithTag(self.defaultTagValue)?.alpha = CGFloat(0.0)
}
}
}
override var text: String! {
didSet{
super.text = text
textChanged()
}
}
override func draw(_ rect: CGRect) {
if !placeholder.isEmpty {
if placeHolderLabel == nil {
placeHolderLabel = UILabel.init(frame: CGRect(x: 0, y: 8, width: bounds.size.width - 16, height: 0))
placeHolderLabel!.lineBreakMode = .byWordWrapping
placeHolderLabel!.numberOfLines = 0
placeHolderLabel!.font = font
placeHolderLabel!.backgroundColor = UIColor.clear
placeHolderLabel!.textColor = placeholderColor
placeHolderLabel!.alpha = 0
placeHolderLabel!.tag = defaultTagValue
self.addSubview(placeHolderLabel!)
}
placeHolderLabel!.text = placeholder
placeHolderLabel!.sizeToFit()
self.sendSubview(toBack: placeHolderLabel!)
if text.isEmpty && !placeholder.isEmpty {
viewWithTag(defaultTagValue)?.alpha = 1.0
}
}
super.draw(rect)
}
}
Swift 3.1
Nachdem ich alle schnellen Antworten ausprobiert hatte, hätte mir diese Antwort 3 Stunden Recherche erspart. Ich hoffe, das hilft.
Stellen Sie sicher, dass Ihr textField (unabhängig vom benutzerdefinierten Namen) auf seinen Delegaten im Storyboard verweist und ein @IBOutlet mit yourCustomTextField
Hinzufügen zu viewDidLoad()
das Folgende, so wird es beim Laden der Ansicht angezeigt:
Zeigen Sie mir, was wie ein Platzhalter aussieht:
yourCustomTextField = "Start typing..."
yourCustomTextField.textColor = .lightGray
UIViewController, UITextViewDelegate, UINavigationControllerDelegate
Dieser Code sorgt dafür, dass IhrCustomTextField verschwindet, wenn Sie in das textField tippen:
func textViewDidBeginEditing (_ textView: UITextView) {
if (textView.text == "Start typing...") {
textView.text = ""
textView.textColor = .black
}
textView.becomeFirstResponder()
}
func textViewDidEndEditing(_ textView: UITextView) {
if (textView.text == "") {
textView.text = "Start typing..."
textView.textColor = .lightGray
}
textView.resignFirstResponder()
}
Ich habe eine eigene Lösung gefunden
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if ([textView.text isEqualToString:PLACEHOLDER_TEXT])
{
textView.textColor = [UIColor lightGrayColor];
dispatch_async(dispatch_get_main_queue(), ^
{
textView.selectedRange = NSMakeRange(0, 0);
});
}
else
{
textView.textColor = [UIColor blackColor];
}
[textView becomeFirstResponder];
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if ([textView.text isEqualToString:@""])
{
textView.text = PLACEHOLDER_TEXT;
textView.textColor = [UIColor lightGrayColor];
}
[textView resignFirstResponder];
}
- (BOOL)textView:(UITextView *)textView
shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text
{
if (range.location == 0 && range.length == [[textView text] length] && [text isEqualToString:@""])
{
textView.text = PLACEHOLDER_TEXT;
textView.textColor = [UIColor lightGrayColor];
dispatch_async(dispatch_get_main_queue(), ^
{
textView.selectedRange = NSMakeRange(0, 0);
});
return NO;
}
if ([textView.text isEqualToString:PLACEHOLDER_TEXT])
{
textView.text = @"";
textView.textColor = [UIColor blackColor];
}
return YES;
}
Ich habe die Code von diesem Link . Es gibt nur 7 einfache Schritte. Es fügt ein UILabel zur textView hinzu und blendet das Label aus/ein, wenn Text eingegeben oder aus der textView über die textView's textViewDidChangeSelection(_ textView: UITextView)
Methode delegieren. Ich habe die Schritte in den Kommentaren oberhalb des Codes angegeben.
// 1. make sure to include the UITextViewDelegate
class YourClass: UITextViewDelegate {
@IBOutlet weak var textView : UITextView!
// 2. create placeholder textLabel
let placeHolderTextLabel: UILabel = {
let placeholderLabel = UILabel()
placeholderLabel.text = "Placeholder text..."
placeholderLabel.sizeToFit()
placeholderLabel.textColor = UIColor.lightGray
return placeholderLabel
}()
override func viewDidLoad() {
super.viewDidLoad()
// 3. set textView delegate
textView.delegate = self
configurePlaceholderTextLabel()
}
func configurePlaceholderTextLabel() {
// 4. add placeholder label to textView, set it's frame and font
textView.addSubview(placeHolderTextLabel)
placeHolderTextLabel.frame.origin = CGPoint(x: 5, y: (textView.font?.pointSize)! / 2)
placeHolderTextLabel.font = UIFont.systemFont(ofSize: (textView.font?.pointSize)!)
// 5. decide wether the placeHolderTextLabel is hidden or not depending on if there is or isn't text inside the textView
placeHolderTextLabel.isHidden = !textView.text.isEmpty
}
// 6. implement textView delegate method to update the placeHolderTextLabel when the text is changed
func textViewDidChangeSelection(_ textView: UITextView) {
// 7. decide wether the placeHolderTextLabel is hidden or not depending on if there is or isn't text inside the textView when text in textView is changed
placeHolderTextLabel.isHidden = !textView.text.isEmpty
}
}
Wenn Sie nach einer einfachen Möglichkeit suchen, dies zu erreichen, versuchen Sie meinen Ansatz:
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
if ([[textView text] isEqualToString:PLACE_HOLDER_TEXT]) {
textView.text = @"";
textView.textColor = [UIColor blackColor];
}
return YES;
}
-(BOOL)textViewShouldEndEditing:(UITextView *)textView
{
if ([[textView text] length] == 0) {
textView.text = PLACE_HOLDER_TEXT;
textView.textColor = [UIColor lightGrayColor];
}
return YES;
}
Ja, das war's PLACE_HOLDER_TEXT
ist ein NSString
mit Ihrem Platzhalter
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.