UITextField attributedPlaceholder не имеет эффекта


Я пытаюсь сделать заполнители в моих текстовых полях курсивными, и поскольку мое приложение ориентировано на iOS 6.0 или более новую версию, решил использовать свойство attributedPlaceholder вместо того, чтобы накатывать что-то более обычное. Код выглядит следующим образом:

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;
}

Тем не менее стиль заполнителя все еще не курсив, но такой же, как обычный текст, только более тусклый. Чего мне не хватает, чтобы заставить NSAttributedString работать?

4 13

4 ответа:

Как отметил Уоррен, стиль в настоящее время не может быть выполнен так, как вы пытаетесь. Хорошим обходным путем было бы настроить атрибуты шрифта вашего текстового поля так, как вы хотели бы, чтобы ваш заполнитель выглядел, а затем изменить шрифт текстового поля всякий раз, когда пользователь начинает печатать. Он будет выглядеть так, как будто заполнитель и текст-это разные шрифты.

Это можно сделать, создав делегат текстового поля и используя shouldChangeCharactersinRange следующим образом:

- (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;
}

Это почти наверняка ошибка. Документация для свойства attributedPlaceholder утверждает, что строка будет отрисована с использованием серого цвета независимо от атрибута цвета переднего плана, но это не так: вы можете установить как цвет переднего плана, так и цвет фона. К сожалению, атрибут шрифта, по-видимому, удаляется и возвращается к системному шрифту.

В качестве обходного пути я рекомендую переопределить drawPlaceholderInRect: и нарисовать заполнитель самостоятельно. Кроме того, вы должны подать Радар на этом и включает в себя минимальный пример проекта, который демонстрирует ошибку.

Я только что сам наткнулся на этот вопрос. По-видимому, заполнитель будет принимать любой шрифт, назначенный текстовому полю. Просто установите шрифт текстового поля, и Вы хороши.

Для всего остального, как цвет заполнителя, я бы все равно вернулся к attributedPlaceholder

IOS8 / 9 / Swift 2.0-рабочий пример

func colorPlaceholderText(){
    var multipleAttributes = [String : NSObject]()
    multipleAttributes[NSForegroundColorAttributeName] = UIColor.appColorCYAN()
    //OK - comment in if you want background color
    //multipleAttributes[NSBackgroundColorAttributeName] = UIColor.yellowColor()
    //OK - Adds underline
    //multipleAttributes[NSUnderlineStyleAttributeName] = NSUnderlineStyle.StyleDouble.rawValue


    let titleString = "Search port/country/vessel..."
    let titleAttributedString = NSAttributedString(string: titleString,
        attributes: multipleAttributes)


    self.textFieldAddSearch.attributedPlaceholder = titleAttributedString
}