Search code examples
iosuitextfieldnsattributedstring

UITextField attributedPlaceholder has no effect


I'm trying to make the placeholders in my textfields italic, and since my app is targeting iOS 6.0 or newer, decided to use attributedPlaceholder property instead of rolling something more custom. The code goes as follows:

NSString *plString = @"optional";
NSAttributedString *placeholder = [[NSAttributedString alloc] initWithString:plString
        attributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:15]}];
for (UITextField *t in myTextfields){
    t.placeholder = plString;
    t.attributedPlaceholder = placeholder;
}

Yet the styling of the placeholder still is not italic, but the same as regular text, just dimmer. What am I missing to make the NSAttributedString work?


Solution

  • As noted by warren, the styling currently can't be accomplished the way you're trying. A good workaround would be to set up your textfield's font attributes the way you would like your placeholder to look and then change the font of the textfield whenever the user begins typing. It will look like the placeholder and text are different fonts.

    You can do this by creating a delegate of the textfield and utilizing shouldChangeCharactersinRange like this:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {    
        // If there is text in the text field
        if (textField.text.length + (string.length - range.length) > 0) {
            // Set textfield font
            textField.font = [UIFont fontWithName:@"Font" size:14];
        } else {
            // Set textfield placeholder font (or so it appears)
            textField.font = [UIFont fontWithName:@"PlaceholderFont" size:14];
        }
    
        return YES;
    }