web-dev-qa-db-fra.com

Modification de la police UITextField Placeholder

Je change la couleur du texte de l'espace réservé avec le code suivant, mais lorsque j'essaie d'ajouter NSFontAttribute, l'erreur de compilateur "too many arguments to method call, expect 2 have 3" s'affiche.

 UIColor *color = [UIColor blackColor];
        _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color},@{NSFontAttributeName:@"Roboto-Bold"}]; 

Cela fonctionne très bien:

 UIColor *color = [UIColor blackColor];
        _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color}]; 
50
Bob Yousuk

Objectif c:

UIColor *color = [UIColor blackColor];    
someUITextField.attributedPlaceholder =
  [[NSAttributedString alloc] initWithString:@"Placeholder Text"
    attributes:@{
       NSForegroundColorAttributeName: color,
       NSFontAttributeName : [UIFont fontWithName:@"Roboto-Bold" size:17.0]
    }
  ];

(Il n'y a pas de crochets entre les paires clé-valeur dictionary littérales.)

Rapide:

let attributes = [
    NSForegroundColorAttributeName: UIColor.blackColor(),
    NSFontAttributeName : UIFont(name: "Roboto-Bold", size: 17)! // Note the !
]

someUITextField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes:attributes)
126
ddevaz

Mise à jour pour Swift 4.x :

textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: [
    .foregroundColor: UIColor.lightGray,
    .font: UIFont.boldSystemFont(ofSize: 14.0)
])
16
ayalcinkaya

Pour la commodité des personnes rapides:

someTextField.attributedPlaceholder = NSAttributedString(string: "someString", 
attributes:[NSForegroundColorAttributeName: UIColor.lightGrayColor(), NSFontAttributeName: PlaceHolderFont])
8
harthoo

Vous devez sous-classe UITextField et remplacer la méthode de:

- (void)drawPlaceholderInRect:(CGRect)rect;

Voici l'implémentation ci-dessous:

- (void)drawPlaceholderInRect:(CGRect)rect {
     NSDictionary *attributes = @{
                             NSForegroundColorAttributeName : [UIColor lightGrayColor],
                             NSFontAttributeName : [UIFont italicSystemFontOfSize:self.font.pointSize]
                             };
    // center vertically
    CGSize textSize = [self.placeholder sizeWithAttributes:attributes];
    CGFloat hdif = rect.size.height - textSize.height;
    hdif = MAX(0, hdif);
    rect.Origin.y += ceil(hdif/2.0);
    [[self placeholder] drawInRect:rect withAttributes:attributes];
}

Pour plus vous pouvez trouver cliquez ici

6
tianglin

Version de travail pour Swift 4

let attributes = [NSAttributedStringKey.foregroundColor: UIColor.black,
                      .font : UIFont.systemFont(ofSize: 14, weight: .regular)]

someTextfield.attributedPlaceholder = NSAttributedString(string: "Placeholder text", attributes:attributes)
5
swift2geek

Appréciez la réponse de @ddevaz.

Solution de sous-classe UITextField

La réponse ci-dessus fonctionne parfaitement pour UITextField. Mais quand j'utilise la sous-classe UITextField et que j'essaie d'y exécuter cette méthode. Alors ça ne marche pas.  

J'ai trouvé une autre solution uniquement lorsque vous sous-classe UITextField. Remplacez la méthode ci-dessous dans votre sous-classe UITextField et il fera le travail pour vous.

- (void) drawPlaceholderInRect:(CGRect)rect {
    NSDictionary *attrDictionary = @{
                                     NSForegroundColorAttributeName: [UIColor lightGrayColor],
                                     NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:17.0]
                                     };

    [[self placeholder] drawInRect:rect withAttributes:attrDictionary];
}
3
Kampai

Mise à jour pour Swift 4

let attributes = [
    NSAttributedStringKey.foregroundColor: .black,
    NSAttributedStringKey.font : UIFont(name: "Your font name", size: 14)!
]

someTextfield.attributedPlaceholder = NSAttributedString(string: "Placeholder text", attributes:attributes)
2
Christopher Larsen

Si vous souhaitez prendre en charge à la fois iOS 6 et les versions précédentes, alors:

UIColor *placeholderColor = [UIColor lightTextColor];
UIFont *placeholderFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];

if ([textField respondsToSelector:@selector(attributedPlaceholder)]) {
#ifdef __IPHONE_6_0
    textField.attributedPlaceholder = [[NSAttributedString alloc]
        initWithString:textField.placeholder attributes: // NOTE: textField.placeholder can't be nil
              @{ NSForegroundColorAttributeName : placeholderColor,
                 NSFontAttributeName : placeholderFont }];
#endif
} else { // for pre-iOS6
    [textField setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
    [textField setValue:placeholderFont forKeyPath:@"_placeholderLabel.font"];
}
1
Laszlo

Vous pouvez utiliser le code ci-dessous Premier nom de la police acceptée par le système pour votre police personnalisée

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

puis utilisez le code ci-dessous pour créer votre espace réservé avec une police personnalisée

searchTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Where are you shopping?" attributes:@{NSFontAttributeName : font }];

Sinon, il est possible d'obtenir un objet nul [1] pour une police introuvable.

0
Kirtikumar A.

Swift 4: Placeholder Changement de couleur à l'aide de la sous-classe UITextField 

override func drawPlaceholder(in rect: CGRect) {

        let color = UIColor(red: 210/255, green: 210/255, blue: 210/255, alpha: 1.0)

        if (placeholder?.responds(to: #selector(NSString.draw(in:withAttributes:))))! {

            let fontS = UIFont.systemFont(ofSize: 12)

            let attributes = [NSAttributedStringKey.foregroundColor: color, NSAttributedStringKey.font: fontS] as [NSAttributedStringKey : Any]

            let boundingRect: CGRect = placeholder!.boundingRect(with: rect.size, options: [], attributes: attributes, context: nil)

            placeholder?.draw(at: CGPoint(x: 0, y: (rect.size.height / 2) - boundingRect.size.height / 2), withAttributes: attributes)
        }

 }
0
McDonal_11
    let attributes: [NSAttributedStringKey : Any] = [NSAttributedStringKey.foregroundColor: UIColor.black,
 NSAttributedStringKey.font: UIFont(name: "Menlo", size: 17.0) ?? UIFont.systemFont(ofSize: 17.0) ]


    textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: attributes)

Remarque: lorsque nous utilisons la méthode UIFont (name: "Menlo", size: 17.0), si le nom de la police ne peut pas l’obtenir dans ios, il sera donc nul, nous devons donc fournir la police par défaut. Cela a été expliqué ci-dessus. 

Vous pouvez utiliser le code ci-dessous Première recherche du nom de la police système acceptée pour votre police personnalisée

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