iPhone UITextField - Изменить цвет текста заполнителя - PullRequest
537 голосов
/ 27 августа 2009

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

Я бы предпочел сделать это без использования обычного текста в качестве заполнителя и необходимости переопределять все методы для имитации поведения заполнителя.

Я верю, если переопределю этот метод:

- (void)drawPlaceholderInRect:(CGRect)rect

тогда я смогу сделать это. Но я не уверен, как получить доступ к фактическому объекту-заполнителю из этого метода.

Ответы [ 31 ]

787 голосов
/ 04 декабря 2012

Начиная с появления приписанных строк в UIViews в iOS 6, можно назначить цвет для текста заполнителя как это:

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}
237 голосов
/ 25 февраля 2014

Легко и безболезненно, для некоторых может быть легкой альтернативой.

_placeholderLabel.textColor

Не предлагается для производства, Apple может отклонить вашу заявку.

194 голосов
/ 03 августа 2010

Вы можете переопределить drawPlaceholderInRect:(CGRect)rect как таковой, чтобы вручную отобразить текст заполнителя:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
165 голосов
/ 08 ноября 2013

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

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
159 голосов
/ 04 января 2010

Возможно, вы захотите попробовать этот способ, но Apple может предупредить вас о доступе к приватному ivar:

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

Примечание
По словам Мартина Аллеуса, это больше не работает на iOS 7.

130 голосов
/ 06 января 2015

Это работает в Swift <3.0: </p>

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

Протестировано в iOS 8.2 и iOS 8.3 beta 4.

Swift 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

Swift 4:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])

Swift 4.2:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
65 голосов
/ 11 декабря 2014

В Свифт:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

В Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
44 голосов
/ 21 мая 2017

Swift 3.0 + раскадровка

Чтобы изменить цвет заполнителя в раскадровке, создайте расширение со следующим кодом. (не стесняйтесь обновлять этот код, если вы думаете, он может быть яснее и безопаснее).

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

enter image description here

Swift 4 версия

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedStringKey: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Swift 5 версия

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedString.Key: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}
43 голосов
/ 19 мая 2014

Следующее только с iOS6 + (как указано в комментарии Александра W):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];
32 голосов
/ 12 февраля 2016

С этим мы можем изменить цвет текста заполнителя текстового поля в iOS

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...