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?
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.
À 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}];
Il y a plusieurs façons d'y parvenir.
Utilisation d'Interface Builder ou de Storyboard
Chemin de la clé = _placeholderLabel.textColor
Cliquez sur l'attribut Type et choisissez Couleur.
Puis sélectionnez la couleur en valeur.
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]];
}
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"];
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]
}
];