简体   繁体   English

使用 Swift 更改占位符文本颜色

[英]Changing Placeholder Text Color with Swift

I have a design that implements a dark blue UITextField , as the placeholder text is by default a dark grey colour I can barely make out what the place holder text says.我有一个实现深蓝色UITextField的设计,因为占位符文本默认为深灰色,我几乎看不出占位符文本的内容。

I've googled the problem of course but I have yet to come up with a solution while using the Swift language and not Obj-c.我当然已经用谷歌搜索了这个问题,但我还没有想出一个解决方案,同时使用 Swift 语言而不是 Obj-c。

Is there a way to change the placeholder text colour in a UITextField using Swift?有没有办法使用 Swift 更改UITextField的占位符文本颜色?

You can set the placeholder text using an attributed string . 您可以使用属性字符串设置占位符文本。 Pass the color you want with the attributes : 通过attributes传递所需的颜色:

var myTextField = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 30))
myTextField.backgroundColor = .blue
myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text",
                             attributes: [NSForegroundColorAttributeName: UIColor.yellow])

For Swift 3+ use following: 对于Swift 3+,请使用以下命令:

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

For Swift 4.2 use following: 对于Swift 4.2,请使用以下命令:

myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text",
                             attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])

You can accomplish this quickly, without adding a line of code, using Interface Builder. 您可以使用Interface Builder快速完成此操作,而无需添加任何代码。

Select the UITextField and open the identity inspector on the right: 选择UITextField并在右侧打开身份检查器:

在此处输入图片说明

Click on the plus button and add a new runtime attribute: 单击加号按钮并添加新的运行时属性:

placeholderLabel.textColor (Swift 4) placeholderLabel.textColor (快速4)

_placeholderLabel.textColor (Swift 3 or less) _placeholderLabel.textColor (Swift 3或以下)

Use Color as type and select the color. 使用颜色作为类型,然后选择颜色。

That's it. 而已。

You wont see the result until you run your app again. 在再次运行应用程序之前,您不会看到结果。

Create UITextField Extension like this: 创建UITextField扩展,如下所示:

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

And in your storyboard or .xib. 并在您的情节提要或.xib中。 You will see 你会看见

在此处输入图片说明

This code is working in Swift3: 这段代码在Swift3中运行:

yourTextFieldName .setValue(UIColor.init(colorLiteralRed: 80/255, green: 80/255, blue: 80/255, alpha: 1.0), forKeyPath: "_placeholderLabel.textColor")

let me know if you have any issue. 让我知道您是否有任何问题。

In Swift 3.0, Use 在Swift 3.0中,使用

let color = UIColor.lightText
textField.attributedPlaceholder = NSAttributedString(string: textField.placeholder, attributes: [NSForegroundColorAttributeName : color])

To set the placeholder color once for all the UITextField in your app you can do: 要为您的应用程序中的所有UITextField一次设置占位符颜色,您可以执行以下操作:

UILabel.appearanceWhenContainedInInstancesOfClasses([UITextField.self]).textColor = UIColor.redColor()

This will set the desired color for all TextField placeholders in the entire app. 这将为整个应用程序中的所有TextField占位符设置所需的颜色。 But it is only available since iOS 9. 但仅自iOS 9起可用。

There is no appearenceWhenContainedIn....() method before iOS 9 in swift but you can use one of the solutions provided here appearanceWhenContainedIn in Swift Swift 9之前的iOS 9之前没有出现encesWhenContainedIn ....()方法,但是您可以使用此处提供的解决方案之一在Swift中

Xcode 9.2 Swift 4 Xcode 9.2 Swift 4

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

In my case, I use Swift 4 就我而言,我使用Swift 4

I create extension for UITextField 我为UITextField创建扩展

extension UITextField {
    func placeholderColor(color: UIColor) {
        let attributeString = [
            NSAttributedStringKey.foregroundColor: color.withAlphaComponent(0.6),
            NSAttributedStringKey.font: self.font!
            ] as [NSAttributedStringKey : Any]
        self.attributedPlaceholder = NSAttributedString(string: self.placeholder!, attributes: attributeString)
    }
}

yourField.placeholderColor(color: UIColor.white) yourField.placeholderColor(color:UIColor.white)

Swift 3 (probably 2), you can override didSet on placeholder in UITextField subclass to apply attribute on it, this way: Swift 3(可能是2),您可以重写UITextField子类中占位符上的didSet,以通过以下方式对其应用属性:

override var placeholder: String? {

    didSet {
        guard let tmpText = placeholder else {
            self.attributedPlaceholder = NSAttributedString(string: "")
            return
        }

        let textRange = NSMakeRange(0, tmpText.characters.count)
        let attributedText = NSMutableAttributedString(string: tmpText)
        attributedText.addAttribute(NSForegroundColorAttributeName , value:UIColor(white:147.0/255.0, alpha:1.0), range: textRange)

        self.attributedPlaceholder = attributedText
    }
}

对于Swift 3和3.1,这可以很好地工作:

passField.attributedPlaceholder = NSAttributedString(string: "password", attributes: [NSForegroundColorAttributeName: UIColor.white])

对于Swift 4.0,X-code 9.1版本或iOS 11,您可以使用以下语法来设置不同的占位符颜色

textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: [NSAttributedStringKey.foregroundColor : UIColor.white])

Here is my quick implementation for swift 4: 这是我对Swift 4的快速实现:

extension UITextField {
    func placeholderColor(_ color: UIColor){
        var placeholderText = ""
        if self.placeholder != nil{
            placeholderText = self.placeholder!
        }
        self.attributedPlaceholder = NSAttributedString(string: placeholderText, attributes: [NSAttributedStringKey.foregroundColor : color])
    }
}

use like: 用途像:

streetTextField?.placeholderColor(AppColor.blueColor)

hope it helps someone! 希望对别人有帮助!

For Swift 对于斯威夫特

Create UITextField Extension 创建UITextField扩展

extension UITextField{

    func setPlaceHolderColor(){
        self.attributedPlaceholder = NSAttributedString(string: self.placeholder!, attributes: [NSForegroundColorAttributeName : UIColor.white])
    }
}

If Are you set from storyboard. 如果是从情节提要中设置的。

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

I'm surprised to see how many poor solutions there are here. 我很惊讶地看到这里有多少糟糕的解决方案。

Here is a version that will always work. 这是一个始终有效的版本。

Swift 4.2 斯威夫特4.2

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

TIP : If you change the placeholder text after setting the color- the color will reset. 提示 :如果在设置颜色后更改占位符文本,则颜色将重置。

Swift 4 : 斯威夫特4:

txtControl.attributedPlaceholder = NSAttributedString(string: "Placeholder String...",attributes: [NSAttributedStringKey.foregroundColor: UIColor.gray])

Objective-C : 目标-C:

UIColor *color = [UIColor grayColor];
txtControl.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder String..." attributes:@{NSForegroundColorAttributeName: color}];

In my case, I had to make the placeholder into black color.就我而言,我必须将占位符设为黑色。 The name of my UITextField is passwordText .我的UITextField的名称是passwordText Below code is tested in Swift 5 and is working fine for me.下面的代码在Swift 5 中进行了测试,对我来说工作正常。 I also had an existing text for the corresponding placeholder.我也有相应占位符的现有文本。

let placeholderColor = UIColor.black
passwordText.attributedPlaceholder = NSAttributedString(string: passwordText.placeholder!, attributes: [NSAttributedString.Key.foregroundColor : placeholderColor])

对于4.2或更高版本,您可以按以下步骤操作:

textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])

In my case, I have done following: 就我而言,我已经完成以下工作:

extension UITextField {
    @IBInspectable var placeHolderColor: UIColor? {
        get {
            if let color = self.attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor {
                return color
            }
            return nil
        }
        set (setOptionalColor) {
            if let setColor = setOptionalColor {
                let string = self.placeholder ?? ""
                self.attributedPlaceholder = NSAttributedString(string: string , attributes:[NSAttributedString.Key.foregroundColor: setColor])
            }
        }
    }
}

Here am i writing all UIDesignable of UITextField. 我在这里编写UITextField的所有UIDesignable。 With the help of this code you can directly access it from UI file Inspector in storyboard 借助此代码,您可以从情节提要中的UI文件检查器直接访问它

@IBDesignable
class CustomTextField: UITextField {

@IBInspectable var leftImage: UIImage? {
    didSet {
        updateView()
    }
}

@IBInspectable var leftPadding: CGFloat = 0 {
    didSet {
        updateView()
    }
}

@IBInspectable var rightImage: UIImage? {
    didSet {
        updateView()
    }
}

@IBInspectable var rightPadding: CGFloat = 0 {
    didSet {
        updateView()
    }
}

private var _isRightViewVisible: Bool = true
var isRightViewVisible: Bool {
    get {
        return _isRightViewVisible
    }
    set {
        _isRightViewVisible = newValue
        updateView()
    }
}

func updateView() {
    setLeftImage()
    setRightImage()

    // Placeholder text color
    attributedPlaceholder = NSAttributedString(string: placeholder != nil ?  placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: tintColor])
}

func setLeftImage() {
    leftViewMode = UITextField.ViewMode.always
    var view: UIView

    if let image = leftImage {
        let imageView = UIImageView(frame: CGRect(x: leftPadding, y: 0, width: 20, height: 20))
        imageView.image = image
        // Note: In order for your image to use the tint color, you have to select the image in the Assets.xcassets and change the "Render As" property to "Template Image".
        imageView.tintColor = tintColor

        var width = imageView.frame.width + leftPadding

        if borderStyle == UITextField.BorderStyle.none || borderStyle == UITextField.BorderStyle.line {
            width += 5
        }

        view = UIView(frame: CGRect(x: 0, y: 0, width: width, height: 20))
        view.addSubview(imageView)
    } else {
        view = UIView(frame: CGRect(x: 0, y: 0, width: leftPadding, height: 20))
    }

    leftView = view
}

func setRightImage() {
    rightViewMode = UITextField.ViewMode.always

    var view: UIView

    if let image = rightImage, isRightViewVisible {
        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        imageView.image = image
        // Note: In order for your image to use the tint color, you have to select the image in the Assets.xcassets and change the "Render As" property to "Template Image".
        imageView.tintColor = tintColor

        var width = imageView.frame.width + rightPadding

        if borderStyle == UITextField.BorderStyle.none || borderStyle == UITextField.BorderStyle.line {
            width += 5
        }

        view = UIView(frame: CGRect(x: 0, y: 0, width: width, height: 20))
        view.addSubview(imageView)

    } else {
        view = UIView(frame: CGRect(x: 0, y: 0, width: rightPadding, height: 20))
    }

    rightView = view
}


@IBInspectable public var borderColor: UIColor = UIColor.clear {
    didSet {
        layer.borderColor = borderColor.cgColor
    }
}

@IBInspectable public var borderWidth: CGFloat = 0 {
    didSet {
        layer.borderWidth = borderWidth
    }
}

@IBInspectable public var cornerRadius: CGFloat = 0 {
    didSet {
        layer.cornerRadius = cornerRadius
    }
}
@IBInspectable public var bottomBorder: CGFloat = 0 {
    didSet {
       borderStyle = .none
        layer.backgroundColor = UIColor.white.cgColor

        layer.masksToBounds = false
     //   layer.shadowColor = UIColor.gray.cgColor
        layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
        layer.shadowOpacity = 1.0
        layer.shadowRadius = 0.0
    }
}
@IBInspectable public var bottomBorderColor : UIColor = UIColor.clear {
    didSet {

        layer.shadowColor = bottomBorderColor.cgColor
        layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
        layer.shadowOpacity = 1.0
        layer.shadowRadius = 0.0
    }
}
/// Sets the placeholder color
@IBInspectable var placeHolderColor: UIColor? {
    get {
        return self.placeHolderColor
    }
    set {
        self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: newValue!])
    }
}

}

只需将以下代码写入Appdelegate的didFinishLaunchingWithOptions方法即可, 如果您想更改Swift 4.2编写的整个应用程序,请使用此代码

UILabel.appearance(whenContainedInInstancesOf: [UITextField.self]).textColor = UIColor.white

For Swift 对于斯威夫特

func setPlaceholderColor(textField: UITextField, placeholderText: String) {
    textField.attributedPlaceholder = NSAttributedString(string: placeholderText, attributes: [NSForegroundColorAttributeName: UIColor.pelorBlack])
}

You can use this; 您可以使用它;

self.setPlaceholderColor(textField: self.emailTextField, placeholderText: "E-Mail/Username")

It is more about personalize your textField but anyways I'll share this code got from another page and made it a little better: 它更多是关于个性化textField的,但是无论如何,我将分享从另一页获得的代码,并使其变得更好一点:

import UIKit
extension UITextField {
func setBottomLine(borderColor: UIColor, fontColor: UIColor, placeHolderColor:UIColor, placeHolder: String) {
    self.borderStyle = UITextBorderStyle.none
    self.backgroundColor = UIColor.clear
    let borderLine = UIView()
    let height = 1.0
    borderLine.frame = CGRect(x: 0, y: Double(self.frame.height) - height, width: Double(self.frame.width), height: height)
    self.textColor = fontColor
    borderLine.backgroundColor = borderColor
    self.addSubview(borderLine)
    self.attributedPlaceholder = NSAttributedString(
        string: placeHolder,
        attributes: [NSAttributedStringKey.foregroundColor: placeHolderColor]
    )
  }
}

And you can use it like this: 您可以像这样使用它:

self.textField.setBottomLine(borderColor: lineColor, fontColor: fontColor, placeHolderColor: placeHolderColor, placeHolder: placeHolder)

Knowing that you have an UITextField connected to a ViewController . 知道您有一个UITextField连接到ViewController

Source: http://codepany.com/blog/swift-3-custom-uitextfield-with-single-line-input/ 资料来源: http : //codepany.com/blog/swift-3-custom-uitextfield-with-single-line-input/

crubio's answer update for Swift 4 Crubio的Swift 4答案更新

Select the UITextField and open the identity inspector on the right: 选择UITextField并在右侧打开身份检查器:

Click on the plus button and add a new runtime attribute: placeholderLabel.textColor (instead of _placeholderLabel.textColor) 单击加号按钮,然后添加一个新的运行时属性: placeholderLabel.textColor (而不是_placeholderLabel.textColor)

Use Color as type and select the color. 使用颜色作为类型,然后选择颜色。

If you run your project, you will see the changes. 如果您运行项目,则将看到更改。

在此处输入图片说明

For Objective C : 对于目标C

UIColor *color = [UIColor colorWithRed:0.44 green:0.44 blue:0.44 alpha:1.0];
 emailTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Friend's Email" attributes:@{NSForegroundColorAttributeName: color}];

For Swift : 对于Swift

emailTextField.attributedPlaceholder = NSAttributedString(string: "Friend's Email",
                             attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])

Objective C code for changing placeholder text color. 用于更改占位符文本颜色的目标C代码。

First import this objc/runtime class - 首先导入这个objc / runtime类-

 #import <objc/runtime.h> 

then replace your textfield name - 然后替换您的文本字段名称-

 Ivar ivar = class_getInstanceVariable([UITextField class], "_placeholderLabel"); UILabel *placeholderLabel = object_getIvar(YourTxtField, ivar); placeholderLabel.textColor = [UIColor whiteColor]; 

for iOS13 适用于iOS13

+(void)ChangeplaceholderColor :(UITextField *)TxtFld andColor:(UIColor*)color { 
    NSMutableAttributedString *placeholderAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:TxtFld.attributedPlaceholder];
       [placeholderAttributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, [placeholderAttributedString length])];
       TxtFld.attributedPlaceholder = placeholderAttributedString;

}

Use like this in Swift,在 Swift 中像这样使用,

 let placeHolderText = textField.placeholder ?? ""
 let str = NSAttributedString(string:placeHolderText!, attributes: [NSAttributedString.Key.foregroundColor :UIColor.lightGray])
 textField.attributedPlaceholder = str

In Objective C在目标 C

NSString *placeHolder = [textField.placeholder length]>0 ? textField.placeholder: @"";
NSAttributedString *str = [[NSAttributedString alloc] initWithString:placeHolder attributes:@{ NSForegroundColorAttributeName : [UIColor lightGrayColor] }];
textField.attributedPlaceholder = str;
    extension UITextField{
            @IBInspectable var placeHolderColor: UIColor? {
                get {
                    return self.placeHolderColor
                }
                set {
                    self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ?
        self.placeholder! : "",
        attributes:[NSAttributedString.Key.foregroundColor : newValue!])
                }
            } 
}

Use this for adding an attributed placeholder: 使用它来添加属性占位符:

let attributes : [String : Any]  = [ NSForegroundColorAttributeName: UIColor.lightGray,
                                     NSFontAttributeName : UIFont(name: "Helvetica Neue Light Italic", size: 12.0)!
                                   ]
x_textfield.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes:attributes)

对于Swift 4

txtField1.attributedPlaceholder = NSAttributedString(string: "-", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
yourTextfield.attributedPlaceholder = NSAttributedString(string: "your placeholder text",attributes: [NSForegroundColorAttributeName: UIColor.white])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM