2014-01-12 2 views
73

Как динамически менять цвет заполнителя UITextField? Это всегда один и тот же системный цвет.Изменение цвета заполнителя UITextField

В редакторе xib нет опции.

+0

В каких случаях вы, что изменить цвет? – Suryakant

+0

, когда UITextField отключен – theWalker

+1

Дубликат ?: [iPhone UITextField - Изменить цвет текста заполнителя] (http://stackoverflow.com/q/1340224/456814). –

ответ

161

От Docs

@property (неатомической, копия) NSAttributedString * attributedPlaceholder

Это свойство равно нулю по умолчанию. Если установлено, строка-заполнитель рисуется с использованием 70% -ного серого цвета, а оставшаяся информация стиля (кроме цвета текста) атрибутной строки. Присвоение нового значения этому свойству также заменяет значение свойства placeholder с теми же строковыми данными, хотя без форматирования информации. Присвоение нового значения этому свойству не влияет на любые другие связанные с стилем свойства текстового поля на .

Objective-C

NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"Some Text" attributes:@{ NSForegroundColorAttributeName : [UIColor redColor] }]; 
self.myTextField.attributedPlaceholder = str; 

Swift

let str = NSAttributedString(string: "Text", attributes: [NSForegroundColorAttributeName:UIColor.redColor()]) 
myTextField.attributedPlaceholder = str 
+0

Я не могу проверить его, NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString: myString]; всегда ноль. – theWalker

+0

Почему вы создаете измененную строку? Просто выполните: 'NSAttributedString * str = [[NSAttributedString alloc] initWithString: @" Некоторые текстовые "атрибуты: @ {UITextAttributeTextColor: [UIColor redColor]}];' – rmaddy

+0

Cheers @rmaddy, я использовал NSForegroundColorAttributeName. – DogCoffee

12

Использование ниже кода

[YourtextField setValue:[UIColor colorWithRed:97.0/255.0 green:1.0/255.0 blue:17.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"]; 
+4

Ваше приложение будет отклонено, если вы его используете, вы получаете доступ к частному API. Вместо этого используйте свойство attribitedPlaceholder UITextField. – aumanets

+0

Я думаю, что это не частный API, который вы также можете использовать в текущем приложении. Не использовать какие-либо частные api –

+0

Это частный API, вы получаете доступ к частной переменной «_placeholderLabel». Это не было бы частным, если бы вы могли сделать что-то вроде self.placeholderLabel. – aumanets

3

Я использую это в СВИФТ:

myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

кажется, что это работает для других ... я понятия не имею, почему он не работал для меня, прежде чем ... возможно, некоторые параметры проекта. Спасибо за комментарии. В настоящее время у меня нет способа проверить его снова.

Устаревшее: Но я не знаю, почему текст применяется правильно, но цвет заполнителя остается таким же (черный/серый).

--iOS8

+2

Это не ответ –

+0

Да, это не (ни ваш комментарий). Но я не хочу запускать новый поток, так как этот код является одним и тем же кодом obj-c, переписанным в swift. – Tomino

+0

Я не знаю, почему это не сработало для вас. Но это сработало для меня отлично –

2

Попробуйте это:

NSAttributedString *strUser = [[NSAttributedString alloc] initWithString:@"Username" attributes:@{ NSForegroundColorAttributeName : [UIColor whiteColor] }]; 
NSAttributedString *strPassword = [[NSAttributedString alloc] initWithString:@"Password" attributes:@{ NSForegroundColorAttributeName : [UIColor whiteColor] }]; 

self.username.attributedPlaceholder = strUser; 
self.password.attributedPlaceholder = strPassword; 
+0

Используйте теги кода! – gsamaras

1

Вы можете использовать следующий код

[txtUsername setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; 
0

@ ответ DogCoffee в Swift будет

let placeholderAttrs = [ NSForegroundColorAttributeName : UIColor.redColor()] 
let placeholder = NSAttributedString(string: "Some text", attributes: placeholderAttrs) 

textField.attributedPlaceholder = placeholder 
41

Easy and perfect solution.

_placeholderLabel.textColor 

В быстром

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder", attributes:[NSForegroundColorAttributeName : UIColor.redColor()]) 

Objective-C

UIColor *color = [UIColor grayColor]; 
nameText.attributedPlaceholder = 
    [[NSAttributedString alloc] 
    initWithString:@"Full Name" 
    attributes:@{NSForegroundColorAttributeName:color}]; 

P.S скопирован 3 различных ответов от Stackoverflow.

+1

Предупреждение для '_placeholderLabel': некоторые пользователи сообщают об отказе от Store Store: http://stackoverflow.com/questions/1340224/iphone-uitextfield-change-placeholder-text-color#comment56758204_22017127 – ftvs

1

Это решение работает без подклассов и без какого-либо частного Ивара:

@IBOutlet weak var emailTextField: UITextField! { 
    didSet { 
     if emailTextField != nil { 
      let placeholderText = NSLocalizedString("Tap here to enter", comment: "Tap here to enter") 
      let placeholderString = NSAttributedString(string: placeholderText, attributes: [NSForegroundColorAttributeName: UIColor(white: 0.66, alpha: 1.0)]) 
      emailTextField.attributedPlaceholder = placeholderString 
     } 
    } 
} 
1

Попробуйте это.

UIColor *color = [UIColor redColor]; 
self.txtUsername.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Placeholder Text" attributes:@{NSForegroundColorAttributeName:color}]; 
4

Сначала добавьте это расширение

extension UITextField{ 
    @IBInspectable var placeHolderTextColor: UIColor? { 
     set { 
      let placeholderText = self.placeholder != nil ? self.placeholder! : "" 
      attributedPlaceholder = NSAttributedString(string:placeholderText, attributes:[NSForegroundColorAttributeName: newValue!]) 
     } 
     get{ 
      return self.placeHolderTextColor 
     } 
    } 
} 

Затем вы можете изменить цвет текста для заполнения с помощью раскадровки или просто установить его так:

textfield.placeHolderTextColor = UIColor.red 
-2
[yourtextFieldName setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; 
0

Это улучшенная версия расширения, предоставленного @Medin Piranej выше (хорошая идея, кстати!). Эта версия позволяет избежать бесконечного цикла, если вы попытаетесь получить placeHolderTextColor и предотвратите сбои, если набор цветов равен нулю.

public extension UITextField { 

@IBInspectable public var placeholderColor: UIColor? { 
    get { 
     if let attributedPlaceholder = attributedPlaceholder, attributedPlaceholder.length > 0 { 
      var attributes = attributedPlaceholder.attributes(at: 0, 
                   longestEffectiveRange: nil, 
                   in: NSRange(location: 0, length: attributedPlaceholder.length)) 
      return attributes[NSForegroundColorAttributeName] as? UIColor 
     } 
     return nil 
    } 
    set { 
     if let placeholderColor = newValue { 
      attributedPlaceholder = NSAttributedString(string: placeholder ?? "", 
                 attributes:[NSForegroundColorAttributeName: placeholderColor]) 
     } else { 
      // The placeholder string is drawn using a system-defined color. 
      attributedPlaceholder = NSAttributedString(string: placeholder ?? "") 
     } 
    } 
} 

}

Смежные вопросы