更改UITextField占位符颜色


Answers:


163

从文档

@property(非原子的,副本)NSAttributedString * attributedPlaceholder

默认情况下,此属性为nil。如果设置,则占位符字符串将使用70%的灰色和属性字符串的其余样式信息(文本颜色除外)绘制。为该属性分配新值还将用相同的字符串数据替换占位符属性的值,尽管没有任何格式信息。为该属性分配新值不会影响文本字段的任何其他与样式相关的属性。

物镜

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 *字符串= [[NSMutableAttributedString分配] initWithString:myString]; 永远是零。
theWalker,2014年

为什么要创建可变属性字符串?只是做:NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"Some Text" attributes:@{ UITextAttributeTextColor : [UIColor redColor] }];
rmaddy14年

干杯@rmaddy,我用NSForegroundColorAttributeName。
DogCoffee 2014年

41

简单完美的解决方案。

_placeholderLabel.textColor

迅速

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

物镜

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

PS从Stackoverflow复制了3个不同的答案。


3
警告为_placeholderLabel:一些用户报告的App Store拒绝:stackoverflow.com/questions/1340224/...
ftvs

如果使用_placeholderLabel,则会发生此崩溃。禁止访问UITextField的_placeholderLabel ivar。这是一个应用程序错误
Hosny19年

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,该应用将被拒绝。而是使用UITextField的attributedPlaceholder属性。
aumanets 2014年

我认为这不是可以在当前应用程序中使用的私有API。不使用任何私人api
Pradhyuman sinh 2014年

1
@aumanets这不是私有API ...它是UITextfield的私有属性。它是键值编码...请检查此stackoverflow.com/questions/16601468/…–
Pradhyuman sinh

2
是的,您是对的,这是私人财产。无论如何,以这种方式访问​​属性/变量不是一个好习惯。有一天,Apple可以将该属性的名称更改为其他名称,这将使应用程序崩溃,并且您的代码中将不会收到任何编译警告。
aumanets 2014年

1
如果使用_placeholderLabel,则会发生此崩溃。禁止访问UITextField的_placeholderLabel ivar。这是一个应用程序错误
Hosny19年

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 2015年

我不知道为什么它对您不起作用。但它的工作对我罚款
Terril托马斯

我也不知道,但是似乎这对其他人有用:-)也许某些项目设置...
Tomino 2015年

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,则此版本避免了无休止的循环;如果颜色集为nil,则避免崩溃。

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])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.