Подтвердить что ты не робот

UITextField attributedPlaceholder не влияет

Я пытаюсь сделать placeholders в текстовом поле курсивом, и поскольку мое приложение предназначено для 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?

4b9b3361

Ответ 1

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

Вы можете сделать это, создав делегат текстового поля и используя 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;
}

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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
}