iPhone UITextField - Changer la couleur du texte de l'espace réservé

566

Je voudrais changer la couleur du texte d'espace réservé que j'ai défini dans mes UITextFieldcontrôles, pour le rendre noir.

Je préfère le faire sans utiliser de texte normal comme espace réservé et sans avoir à remplacer toutes les méthodes pour imiter le comportement d'un espace réservé.

Je crois que si je remplace cette méthode:

- (void)drawPlaceholderInRect:(CGRect)rect

alors je devrais pouvoir le faire. Mais je ne sais pas comment accéder à l'objet d'espace réservé réel à partir de cette méthode.

Adam
la source

Réponses:

804

Depuis l'introduction des chaînes attribuées dans UIViews dans iOS 6, il est possible d'attribuer une couleur au texte d'espace réservé comme ceci:

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}
user1071136
la source
2
C'est bien - mais n'oubliez pas que vous devez définir une valeur d'espace réservé dans IB avant que cela ne fonctionne
gheese
4
cela vaut également la peine de l'envelopper dans un appel respondsToSelector - car sans lui, ce code se bloquera sur la cible de déploiement pré 6.0 (sélecteur non reconnu envoyé à l'instance)
gheese
5
La documentation du attributedPlaceholderdit qui utilise des attributs de texte, à l'exception de la couleur.
Matt Connolly
1
Toute idée pourquoi cela ne fonctionne pas pour l'attribut - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u
3
Sur iOS 7, j'ai eu cette erreur:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf
237

Facile et sans douleur, pourrait être une alternative facile pour certains.

_placeholderLabel.textColor

Non suggéré pour la production, Apple peut rejeter votre soumission.

Jack
la source
1
L'utilisez-vous en production? Je veux accéder à une propriété privée.
Geri Borbás
11
Ajoutez peut-être le texte à votre réponse pour un copier-coller rapide. _placeholderLabel.textColor
Philiiiiiipp
47
N'utilisez pas cette méthode, je l'ai utilisée et le magasin itune a rejeté ma demande.
Asad ali
1
Je pense que tout type de méthode de bibliothèque privée ne devrait JAMAIS être recommandé comme solution à quoi que ce soit
Skrew
2
@jungledev _placeholderLabelest une propriété privée. Cette solution est susceptible d'être rejetée pour l'utilisation d'une API privée.
Sean Kladek
194

Vous pouvez remplacer en drawPlaceholderInRect:(CGRect)recttant que tel pour rendre manuellement le texte de l'espace réservé:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
Adam
la source
44
Quelque chose comme ça [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];est probablement mieux. De cette façon, vous respecterez la textAlignmentpropriété. J'ai ajouté cela à ma classe SSTextField . N'hésitez pas à utiliser dans vos projets.
Sam Soffes
52
Ne faites absolument PAS ce que Koteg a dit. NE JAMAIS remplacer les méthodes par des catégories. JAMAIS
Joshua Weinberg
8
@JoshuaWeinberg Y a-t-il une raison spécifique derrière votre suggestion.
Krishnan
5
@Krishnan implémentant une méthode en double dans une catégorie n'est pas pris en charge, et vous ne pouvez jamais être certain de la méthode qui sera appelée, ou si les deux doivent être appelées, ou de l'ordre dans lequel elles seront appelées.
sean woodward
8
Dans iOS7, vous pouvez modifier le rect en utilisant CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) pour centrer verticalement le texte.
Brian S
171

Vous pouvez changer la couleur du texte de l'espace réservé en n'importe quelle couleur souhaitée en utilisant le code ci-dessous.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
Manju
la source
6
Meilleure réponse suggérée. Fonctionne et utilise des API documentées.
Ian Hoar
2
Comment faites-vous cela pour UISearchBar? Il n'y a pas de propriété Placeholder attribuée.
gilsaints88
1
Cette réponse n'est pas correcte - selon les documents, les informations de couleur de texte de AttributedPlaceholder sont ignorées developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler
Merci tout le monde. J'espère que cela vous a été utile. Adlai Holler essayez-le bro !!! Cette réponse concernait la version précédente d'iOS. Si vous avez une meilleure réponse, nous sommes ouverts aux suggestions.
Manju
Ne fonctionne pas sur iOS8 car il n'y a pas de propriété attribuée
Ben Clayton
157

Vous voulez peut-être essayer de cette façon, mais Apple pourrait vous avertir de l'accès à ivar privé:

[self.myTextField setValue:[UIColor darkGrayColor] 
                forKeyPath:@"_placeholderLabel.textColor"];

REMARQUE
Cela ne fonctionne plus sur iOS 7, selon Martin Alléus.

digdog
la source
6
J'utilise cette méthode dans mon application. L'avis était correct. Je pense donc que c'est bien de l'utiliser.
Michael A.
9
Ce n'est pas sûr dans l'App Store et ne doit pas être encouragé, vous n'êtes pas assuré d'obtenir l'approbation ou de rester approuvé avec ces techniques.
Sveinung Kval Bakken
31
Peu importe qu'il soit approuvé ou pas vraiment. L'important est que cela pourrait casser votre application dans les futures mises à jour du système d'exploitation.
pablasso
2
Je n'ai eu aucun problème avec iOS 7 ... Je l'ai essayé malgré la note et cela semble bien fonctionner et j'ai utilisé cette approche dans le passé sans aucun problème.
WCByrne
6
C'était toujours une mauvaise idée, et maintenant c'est cassé sur iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay
154

Cela fonctionne dans Swift <3.0:

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

Testé dans iOS 8.2 et iOS 8.3 beta 4.

Swift 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

Swift 4:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])

Swift 4.2:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
Tomino
la source
L'utilisation de votre solution sur iOS8.2 fonctionne comme un charme. Solution parfaite ici. Utilisation également dans l'objectif C.
Akshit Zaveri
73

Dans Swift:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

Dans Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
Beninho85
la source
Si vous n'avez pas défini le texte de l'espace réservé avant d'appeler, l'application se
bloquera
C'est le meilleur, merci. @apinho rien ne plantera ici
Markus
// Dans Swift 4 si let placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (chaîne: espace réservé, attributs: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini
Attention, la modification de la valeur du texte de l'espace réservé après l'exécution de ce code ramènera la couleur de l'espace réservé par défaut.
Alessandro Vendruscolo
66

Swift 3.0 + Storyboard

Afin de changer la couleur de l'espace réservé dans le storyboard, créez une extension avec le code suivant. (n'hésitez pas à mettre à jour ce code, si vous le pensez, il peut être plus clair et plus sûr).

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

entrez la description de l'image ici

Version Swift 4

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedStringKey: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Version Swift 5

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedString.Key: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}
Nik Kov
la source
Le compilateur ne peut pas le découvrir NSAttributedStringKey.
Milan Kamilya
Fonctionne dans iOS 13
Jalil
43

Ce qui suit uniquement avec iOS6 + (comme indiqué dans le commentaire d'Alexander W):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];
Gaurav Gilani
la source
33

J'avais déjà fait face à ce problème. Dans mon cas, le code ci-dessous est correct.

Objectif c

[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

Pour Swift 4.X

tf_mobile.setValue(UIColor.white, forKeyPath: "_placeholderLabel.textColor")

Pour iOS 13 Swift Code

tf_mobile.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

Vous pouvez également utiliser le code ci-dessous pour iOS 13

let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(tf_mobile, iVar) as! UILabel
placeholderLabel.textColor = .red

J'espère que cela peut vous aider.

Ashu
la source
@Ashu, cela provoque un crash dans ios 13 'L'accès à l'ivar _placeholderLabel d'UITextField est interdit. Ceci est un bug d'application 'il ne sera même pas construit Je ne parle pas de le placer dans l'AppStore
Melany
1
IOS 13 c'était restreint ne peut plus l'utiliser
Kishore Kumar
Le code Objc est testé sur IOS 13 et ne fonctionne pas.
Mehdico
1
@Mehdico J'ai mis à jour la réponse pour iOS 13. J'espère que cela vous aidera.
Ashu
Cela m'a pris beaucoup trop de temps pour apprendre que je devais faire ce changement dans viewWillAppearou viewDidAppear. viewDidLoadest trop tôt.
4
32

Avec cela, nous pouvons changer la couleur du texte d'espace réservé de textfield dans iOS

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];
Uma Madhavi
la source
1
À partir d'iOS13, cela ne fonctionnera pas
Teddy
@Teddy, comment as-tu fait maintenant? J'ai commencé à avoir des problèmes avec ça.
Jalil
@Jalil J'espère que je suis encore à l'heure pour toi. textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString: @ "text" attributs: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}]];
Teddy
18

Pourquoi n'utilisez-vous pas simplement la UIAppearanceméthode:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
Valerii Lider
la source
Fonctionne très bien! La couleur du texte n'est pas affectée (au moins avec un proxy différent pour la propriété textColor)
HotJard
18

Aussi dans votre storyboard, sans une seule ligne de code

entrez la description de l'image ici

Petr Syrov
la source
1
Comment tu sais ça? C'est la meilleure approche, je pense, mais comment savoir cela? Veuillez dire que je suis nouveau dans la programmation ios.
Yawar
2
C'est très universel. Une fois que vous le savez, utilisez-le partout;)
Petr Syrov
Je sais qu'une fois que je comprends ce qui se passe derrière, je vais l'utiliser beaucoup. Mais je veux dire "_placeholderLabel.textColor" cela devrait être une vue enfant de textfield. Existe-t-il un moyen de voir ce type d'informations sur un contrôle?
Yawar
2
@Yawar Vous pouvez utiliser l'inspecteur de hiérarchie des vues dans Xcode ou introspecter la vue dans le débogueur.
David Ganster
bon, quel que soit le champ de texte, vous pouvez utiliser la même 'tuile / nom' pour keypath
Naishta
16

dans swift 3.X

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])

dans swift 5

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])
MAhipal Singh
la source
12

Pour iOS 6.0 +

[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

J'espère que cela aide.

Remarque: Apple peut rejeter (0,01% de chances) votre application car nous accédons à une API privée. J'utilise cela dans tous mes projets depuis deux ans, mais Apple ne l'a pas demandé.

Fahim Parkar
la source
lance un terminating with uncaught exception of type NSExceptionpour iOS8
Yar
10

Pour les développeurs Xamarin.iOS, je l'ai trouvé à partir de ce document https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });
ManuQiao
la source
Merci !! J'utilisais d'abord CTStringAttributes et non UIStringAttributes et je ne pouvais pas le comprendre. Attention à ne pas l'utiliser:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani
9

Version rapide. Cela aiderait probablement quelqu'un.

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}
Max Tymchii
la source
6

Catégories FTW. Pourrait être optimisé pour vérifier un changement de couleur efficace.


#import <UIKit/UIKit.h>

@interface UITextField (OPConvenience)

@property (strong, nonatomic) UIColor* placeholderColor;

@end

#import "UITextField+OPConvenience.h"

@implementation UITextField (OPConvenience)

- (void) setPlaceholderColor: (UIColor*) color {
    if (color) {
        NSMutableAttributedString* attrString = [self.attributedPlaceholder mutableCopy];
        [attrString setAttributes: @{NSForegroundColorAttributeName: color} range: NSMakeRange(0,  attrString.length)];
        self.attributedPlaceholder =  attrString;
    }
}

- (UIColor*) placeholderColor {
    return [self.attributedPlaceholder attribute: NSForegroundColorAttributeName atIndex: 0 effectiveRange: NULL];
}

@end
osxdirk
la source
6

Pour gérer à la fois l'alignement vertical et horizontal ainsi que la couleur de l'espace réservé dans iOS7. drawInRect et drawAtPoint n'utilisent plus le contexte actuel fillColor.

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

Obj-C

@interface CustomPlaceHolderTextColorTextField : UITextField

@end


@implementation CustomPlaceHolderTextColorTextField : UITextField


-(void) drawPlaceholderInRect:(CGRect)rect  {
    if (self.placeholder) {
        // color of placeholder text
        UIColor *placeHolderTextColor = [UIColor redColor];

        CGSize drawSize = [self.placeholder sizeWithAttributes:[NSDictionary dictionaryWithObject:self.font forKey:NSFontAttributeName]];
        CGRect drawRect = rect;

        // verticially align text
        drawRect.origin.y = (rect.size.height - drawSize.height) * 0.5;

        // set alignment
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = self.textAlignment;

        // dictionary of attributes, font, paragraphstyle, and color
        NSDictionary *drawAttributes = @{NSFontAttributeName: self.font,
                                     NSParagraphStyleAttributeName : paragraphStyle,
                                     NSForegroundColorAttributeName : placeHolderTextColor};


        // draw
        [self.placeholder drawInRect:drawRect withAttributes:drawAttributes];
    }
}

@end
aumansoftware
la source
Merci pour cette excellente solution - qui centre correctement le texte verticalement (utile avec les polices personnalisées). La seule chose que j'ajouterais est que cette solution n'est pas compatible avec iOS 6 ou une version antérieure (assez facile à corriger en retombant sur [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alignement: self.textAlignment];
lifjoy
6

iOS 6 et offre plus tard attributedPlaceholdersur UITextField. iOS 3.2 et offre plus tard setAttributes:range:sur NSMutableAttributedString.

Vous pouvez effectuer les opérations suivantes:

NSMutableAttributedString *ms = [[NSMutableAttributedString alloc] initWithString:self.yourInput.placeholder];
UIFont *placeholderFont = self.yourInput.font;
NSRange fullRange = NSMakeRange(0, ms.length);
NSDictionary *newProps = @{NSForegroundColorAttributeName:[UIColor yourColor], NSFontAttributeName:placeholderFont};
[ms setAttributes:newProps range:fullRange];
self.yourInput.attributedPlaceholder = ms;
William Power
la source
Je ne sais pas ce qui cause le problème, j'ai appelé ce code dans viewdidLoad. la nouvelle couleur et la nouvelle taille de police n'apparaissent qu'après redessin. y a-t-il autre chose à faire en parallèle?
Vinayaka Karjigi
il a été résolu, j'ai oublié de définir la police pour UITextfield avant d'utiliser cette police pour le texte d'espace réservé. mon mauvais
Vinayaka Karjigi
6

Cette solution pour Swift 4.1

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])
Mantosh Kumar
la source
4

Remplacer drawPlaceholderInRect:serait la bonne façon, mais cela ne fonctionne pas en raison d'un bogue dans l'API (ou la documentation).

La méthode n'est jamais appelée sur un UITextField.

Voir également drawTextInRect sur UITextField non appelé

Vous pouvez utiliser la solution de digdog. Comme je ne suis pas sûr que cela passe le contrôle des pommes, j'ai choisi une solution différente: superposer le champ de texte avec ma propre étiquette qui imite le comportement de l'espace réservé.

C'est un peu compliqué cependant. Le code ressemble à ceci (notez que je fais cela dans une sous-classe de TextField):

@implementation PlaceholderChangingTextField

- (void) changePlaceholderColor:(UIColor*)color
{    
    // Need to place the overlay placeholder exactly above the original placeholder
    UILabel *overlayPlaceholderLabel = [[[UILabel alloc] initWithFrame:CGRectMake(self.frame.origin.x + 8, self.frame.origin.y + 4, self.frame.size.width - 16, self.frame.size.height - 8)] autorelease];
    overlayPlaceholderLabel.backgroundColor = [UIColor whiteColor];
    overlayPlaceholderLabel.opaque = YES;
    overlayPlaceholderLabel.text = self.placeholder;
    overlayPlaceholderLabel.textColor = color;
    overlayPlaceholderLabel.font = self.font;
    // Need to add it to the superview, as otherwise we cannot overlay the buildin text label.
    [self.superview addSubview:overlayPlaceholderLabel];
    self.placeholder = nil;
}
henning77
la source
Comment vous sentiriez-vous à l'idée de partager votre solution conviviale pour les avis?
Adam
J'ai ajouté la solution que j'ai utilisée. J'ai dû creuser un peu, car c'était il y a quelque temps :)
henning77
J'ai fait quelque chose de similaire à cela, mais j'ai placé le code dans une catégorie et je devais vérifier si shouldChangeCharacters devait le rendre visible, ce qui était une deuxième méthode dans la catégorie appelée - (void) overlayPlaceholderVisible: (BOOL) visible ;
David van Dugteren
3

Je suis nouveau sur xcode et j'ai trouvé un moyen de parvenir au même effet.

J'ai placé un uilabel à la place du support de place avec le format souhaité et le cache dans

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    switch (textField.tag)
    {
        case 0:
            lblUserName.hidden=YES;
            break;

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Je suis d'accord que c'est une solution de contournement et pas une vraie solution, mais l'effet était le même que ce lien

REMARQUE: fonctionne toujours sur iOS 7: |

amar
la source
3

Swift 5 AVEC CAVEAT.

let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.someColor ]
let placeHolderString = NSAttributedString(string: "DON'T_DELETE", attributes: attributes)
txtField.attributedPlaceholder = placeHolderString

La mise en garde étant que vous DEVEZ entrer un non-vide Stringoù "DON'T_DELETE" est, même si cette chaîne est définie dans le code ailleurs. Cela pourrait vous faire économiser cinq minutes de capture de tête.

HenryRootTwo
la source
2

Le mieux que je puisse faire pour iOS7 et moins est:

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)textRectForBounds:(CGRect)bounds {
  CGRect rect = CGRectInset(bounds, 0, 6); //TODO: can be improved by comparing font size versus bounds.size.height
  return rect;
}

- (void)drawPlaceholderInRect:(CGRect)rect {
  UIColor *color =RGBColor(65, 65, 65);
  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName:self.font, UITextAttributeTextColor:color}];
  } else {
    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font];
  }
}
Aleksei Minaev
la source
2

Pour ceux qui utilisent Monotouch (Xamarin.iOS), voici la réponse d'Adam, traduite en C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}
Diego
la source
Génial. Ce n'était pas vraiment évident, vous m'avez probablement fait gagner du temps :) J'ai quand même édité votre solution, car je pense que c'est une meilleure idée d'utiliser le jeu de polices dans la Fontpropriété du champ de texte.
Wolfgang Schreurs
1

Je devais garder l'alignement des espaces réservés, donc la réponse d'Adam ne me suffisait pas.

Pour résoudre ce problème, j'ai utilisé une petite variation qui, j'espère, aidera également certains d'entre vous:

- (void) drawPlaceholderInRect:(CGRect)rect {
    //search field placeholder color
    UIColor* color = [UIColor whiteColor];

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}
Tomer Even
la source
UILineBreakModeTailTruncationest obsolète à partir d'iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Mubin Shaikh
la source
Un petit indice à ce sujet est que vous accédez à un iVar privé (_placeholderLabel) et dans le passé Apple a été un peu fin à le faire. :)
Alexander W
1

Pour définir un espace réservé de champ de texte attribué avec plusieurs couleurs,

Spécifiez simplement le texte,

  //txtServiceText is your Textfield
 _txtServiceText.placeholder=@"Badal/ Shah";
    NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:_txtServiceText.placeholder];
     [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor whiteColor] range:[_txtServiceText.placeholder rangeOfString:@"Badal/"]]; //Replace it with your first color Text
    [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor orangeColor] range:[_txtServiceText.placeholder rangeOfString:@"Shah"]]; // Replace it with your secondcolor string.
    _txtServiceText.attributedPlaceholder=mutable;

Production :-

entrez la description de l'image ici

Badal Shah
la source
0

Une autre option qui ne nécessite pas de sous-classement - laissez l'espace réservé vide et placez une étiquette au-dessus du bouton d'édition. Gérez l'étiquette comme vous le feriez pour l'espace réservé (effacement une fois que l'utilisateur a saisi quoi que ce soit ..)

kolinko
la source
Je pense que ce serait efficace si vous avez un champ de texte, mais si vous essayez de faire ce changement à une échelle plus globale, cette solution ajouterait une quantité considérable de frais généraux à votre projet.
James Parker