Зміна кольору заповнювача UITextField


74

Як динамічно змінювати колір заповнювача UITextField? Це завжди однаковий системний колір.

Немає можливості в редакторі xib.


У яких випадках вам на що змінити колір?
Сурякант Шарма

коли UITextField вимкнено
theWalker

Відповіді:


163

З Документів

@property (неатомна, копія) NSAttributedString * attributedPlaceholder

За замовчуванням ця властивість рівна нулю. Якщо встановлено, рядок заповнювача малюється із використанням 70% сірого кольору та рештою інформації про стиль (крім кольору тексту) віднесеного рядка. Присвоєння нового значення цій властивості також замінює значення властивості заповнювача тими самими рядковими даними, хоча і без інформації про форматування. Призначення нового значення цій властивості не впливає на будь-які інші властивості текстового поля, пов’язані зі стилем.

Завдання-C

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

Стрімкий

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

Стрімкий 4

let str = NSAttributedString(string: "Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
myTextField.attributedPlaceholder = str

Я не можу його перевірити, NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString: myString]; завжди дорівнює нулю.
theWalker

Чому ви створюєте змінний атрибутивний рядок? Просто зробіть:NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"Some Text" attributes:@{ UITextAttributeTextColor : [UIColor redColor] }];
rmaddy

Вітаю @rmaddy, я використовував NSForegroundColorAttributeName.
DogCoffee

41

Просте та ідеальне рішення.

_placeholderLabel.textColor

Швидко

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

Завдання-C

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

PS скопіював 3 різні відповіді зі Stackoverflow.


3
Попередження для _placeholderLabel: деякі користувачі повідомляють про неприйняття App Store: stackoverflow.com/questions/1340224 / ...
ftvs

Якщо ви використовували _placeholderLabel, ви отримаєте цю аварію. Доступ до ivar _placeholderLabel UITextField заборонений. Це помилка програми
Hosny

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. Натомість використовуйте властивість attributedPlaceholder UITextField.
Aumanets

я думаю, що це не приватний API, який ви також можете використовувати в поточному додатку. Не використовуючи жодних приватних api
Pradhyuman sinh

1
@aumanets це не приватна апі ... Це приватна власність UITextField .. Це значення ключа кодування ... перевірити це stackoverflow.com/questions/16601468 / ...
Pradhyuman зп

2
Так, ви маєте рацію, це приватна власність. У будь-якому випадку це не є доброю практикою отримувати доступ до властивостей / змінних таким чином. Одного разу Apple може змінити назву цього властивості на щось інше, що призведе до аварійного завершення роботи програми, і ви не отримаєте жодного попередження про компіляцію у коді.
Aumanets

1
Якщо ви використовували _placeholderLabel, ви отримаєте цю аварію. Доступ до ivar _placeholderLabel UITextField заборонений. Це помилка програми
Hosny

5

Спочатку додайте це розширення

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

3

Я використовую це в SWIFT:

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

Здається, це працює для інших ... Я не уявляю, чому це раніше не працювало для мене ... можливо, деякі налаштування проекту. Дякую за коментарі. В даний час я не маю можливості перевірити це ще раз.

Застаріле: Але я не знаю, чому, текст застосовано правильно, але колір заповнювача залишається незмінним (чорний / сірий).

--iOS8


Так, це не так (ні ваш коментар). Але я не хочу починати новий потік, оскільки цей код - це той самий код obj-c, переписаний швидко.
Томіно

Я не знаю, чому це не спрацювало для вас. Але у мене це спрацювало добре
Терріл Томас

Я також не знаю, але, здається, це працює для інших :-) Можливо, деякі налаштування проекту ...
Tomino

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;

1

Ви можете використовувати наступний код

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

1

Це рішення працює без будь-якого підкласу та без будь-яких приватних ivars:

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

0

Відповідь @ DogCoffee у Swift була б такою

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

textField.attributedPlaceholder = placeholder

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 ?? "")
        }
    }
}

}


0

для swift 3, ми можемо використовувати цей код для зміни кольору тексту заповнювача для UITextfield

 let placeholderColor = UIColor.red
 mytextField.attributedPlaceholder = NSAttributedString(string: mytextField.placeholder, attributes: [NSForegroundColorAttributeName : placeholderColor])

0

Стрімкий 4

let placeholderColor = UIColor.red
self.passwordTextField?.attributedPlaceholder = 
NSAttributedString(string:"placeholderText", attributes: 
[NSAttributedStringKey.foregroundColor : placeholderColor])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.