web-dev-qa-db-fra.com

Comment définir la couleur du texte de substitution pour un UITextField tout en préservant ses propriétés existantes?

J'ai vu des réponses qui montrent comment changer la couleur du texte placeHolder pour UITextField en surchargeant la méthode drawPlaceholderInRect: telle que celle-ci:

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

mais cela ne conserve pas les attributs existants tels que l'alignement, la police de caractères, etc. Quel est le meilleur moyen de résoudre ce problème?

20
Ed Fernandez

Il existe effectivement une bien meilleure façon de gérer cela maintenant. Cela fonctionnera pour iOS 6 et 7.

(Notez cet exemple, j'ai créé le code dans AwakeFromNib car il ne changera pas de couleur une fois défini. Mais si vous n'utilisez pas XIB, vous devrez changer l'emplacement où vous avez mis ce code, comme dans drawPlaceholderInRect,)

Dans cet exemple, nous créons une sous-classe de UITextField, remplaçons awakeFromNib puis définissons la couleur du texte placeHolder sur rouge:

- (void)awakeFromNib
{
    if ([self.attributedPlaceholder length])
    {
        // Extract attributes
        NSDictionary * attributes = (NSMutableDictionary *)[ (NSAttributedString *)self.attributedPlaceholder attributesAtIndex:0 effectiveRange:NULL];

        NSMutableDictionary * newAttributes = [[NSMutableDictionary alloc] initWithDictionary:attributes];

        [newAttributes setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];

        // Set new text with extracted attributes
        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:[self.attributedPlaceholder string] attributes:newAttributes];

    }
}

Le bon côté de cette approche est qu’elle conserve les propriétés UITextField actuelles de la chaîne placeHolder et vous permet donc de travailler dans IB pour la plupart des tâches que vous définissez. En outre, c’est beaucoup plus efficace que de faire chaque fois que vous devez dessiner. Il vous permet également de modifier toute autre propriété de votre choix sur le texte de placeHolder tout en conservant le reste des propriétés.

Comme mentionné ci-dessus, si vous n'utilisez pas de fichiers XIB, vous devrez l'appeler à un autre moment. Si vous placez ce code dans la méthode drawPlaceholderInRect:, assurez-vous d'appeler [super drawPlaceholderInRect:] à la fin de celui-ci.

15
Ed Fernandez

À partir d'iOS 6, 

Sans aucun sous-classement, on peut accomplir cela avec quelques lignes de code comme ceci:

UIColor *color = [UIColor blackColor];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
36
Forrest

Il y a plusieurs façons d'y parvenir.

Utilisation d'Interface Builder ou de Storyboard

  • Sélectionnez le champ de texte pour lequel vous souhaitez modifier la couleur de l'espace réservé
  • accédez au menu de l'inspecteur d'identité en haut à droite de Xcode
  • Ajouter la paire valeur/valeur de cette façon

Chemin de la clé = _placeholderLabel.textColor

Cliquez sur l'attribut Type et choisissez Couleur.

Puis sélectionnez la couleur en valeur. 

 enter image description here

Set La couleur de l'espace réservé en utilisant le code:

Processus 1: 

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

Processus 2:

Remplacer la méthode rect sur drawPlaceholderInRect: (CGRect)

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:14]];
}
20
ABS

Le moyen le plus sûr de personnaliser l’espace réservé UITextField ’est de sous-classer UITextField et de remplacer placeholderRectForBounds:; Apple ne vous dérangera pas avec celui-ci. Cependant, si vous voulez prendre le risque, vous pouvez essayer ceci:

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

La source .

3
Azik Abdullah

ici Voir mon résultatCeci est juste pour obtenir le nom de la police système

for (NSString *familyName in [UIFont familyNames]) {
     for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);

Et ajoutez ce code dans votre viewDidLoad

_textFieldEmail.attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"e-mail address"
                                attributes:@{
                                             NSFontAttributeName : [UIFont fontWithName:@"Roboto-LightItalic" size:17.0]
                                             }
 ];

_textFieldPassword.attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"password"
                                attributes:@{
                                             NSFontAttributeName : [UIFont fontWithName:@"Roboto-LightItalic" size:17.0]
                                             }
 ];
0
Paresh Mangukiya