Thay đổi màu văn bản giữ chỗ bằng Swift


226

Tôi có một thiết kế thực hiện màu xanh lam đậm UITextField, vì văn bản giữ chỗ mặc định là màu xám đậm, tôi hầu như không thể biết được văn bản giữ chỗ nói gì.

Tôi đã giải quyết vấn đề tất nhiên nhưng tôi vẫn chưa đưa ra giải pháp trong khi sử dụng ngôn ngữ Swift chứ không phải Obj-c.

Có cách nào để thay đổi màu văn bản giữ chỗ trong UITextFieldSwift bằng cách sử dụng không?

Câu trả lời:


501

Bạn có thể đặt văn bản giữ chỗ bằng cách sử dụng một chuỗi được gán . Vượt qua màu bạn muốn với 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])

Đối với Swift 3+ sử dụng như sau:

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

Đối với Swift 4.2, hãy sử dụng như sau:

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

SDK iOS 11 - khóa không có foregroundColor: self.emailTextField? .FpributionPlaceholder = NSAttributionString (chuỗi: "văn bản giữ chỗ", các thuộc tính: [NSAttributionStringKey.forgroundColor: UIColor.white])
Matthew Ferguson

@MatthewFerguson, tôi vừa thử nó và nó hoạt động. Bạn có phiên bản phát hành của Xcode 9 không? Các loại là emailTextFieldgì?
vacawama

2
@vacawama. Cảm ơn đã trao đổi. Dự án kế thừa, đã cập nhật Xcode của tôi từ cửa hàng ứng dụng - Phiên bản 9.0 (9A235) và cuối cùng đã đưa ra giải pháp self.passwordTextField? .ClostPlaceholder = NSAttributionString (chuỗi: "PASSWORD", thuộc tính: [NSForegroundColorAttribution
Matthew Ferguson

3
dành cho iOS sử dụng 11 SDKmyTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName: UIColor.white])
Gema Megantara

1
Có cách nào để đặt màu mà không cần đặt chuỗi không?
ScottyBlades

285

Bạn có thể thực hiện việc này một cách nhanh chóng mà không cần thêm một dòng mã, sử dụng Trình tạo giao diện.

Chọn UITextFieldvà mở thanh tra danh tính ở bên phải:

nhập mô tả hình ảnh ở đây

Nhấp vào nút dấu cộng và thêm thuộc tính thời gian chạy mới:

giữ chỗLabel.textColor (Swift 4)

_placeholderLabel.textColor (Swift 3 trở xuống)

Sử dụng màu như loại và chọn màu.

Đó là nó.

Bạn sẽ không thấy kết quả cho đến khi bạn chạy lại ứng dụng của mình.


1
đúng, nhưng đó là một loại hack, vì tài sản giữ chỗLabel.textColor là riêng tư ...
Frédéric Adda

1
ứng dụng sẽ bị từ chối vì chúng tôi đang sử dụng một tài sản riêng của lớp?
Firecast

2
Thật không may, điều này dường như không hoạt động trên iOS 10 ít nhất.
nickdnk

2
@nickdnk Không đúng. Ngay bây giờ tôi đã thử nghiệm trên iOS 10.2.1 và nó hoạt động. :)
Andrej

2
Con đường tốt đến sự cố bất ngờ nếu Apple sẽ thay đổi triển khai nội bộ.)
Vlad

127

Tạo tiện UITextFieldích mở rộng như thế này:

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!])
        }
    }
}

Và trong bảng phân cảnh của bạn hoặc .xib. Bạn sẽ thấy

nhập mô tả hình ảnh ở đây


11
⚠️ Cảnh báo: Phần mở rộng này sẽ sụp đổ chương trình của bạn, bạn nên bao giờ quyết định đọc bất động sản placeHolderColor! Nếu bạn trả về giá trị của chính thuộc tính được tính từ getter của thuộc tính, getter sẽ được gọi lại từ bên trong getter, dẫn đến đệ quy vô hạn. (Xem: stackoverflow.com/a/42334711/2062785 )
Mischa

1
Để khắc phục điều này và có được hành vi dự kiến ​​(nghĩa là màu giữ chỗ chính xác), hãy lấy attributedStringchữ cái đầu tiên (nếu không trống) và trả lại màu văn bản của nó, nếu không nil.
Mischa

Tại sao có 2 màu hiển thị trong hộp. Tôi nghĩ rằng đây là cho chế độ tối nhưng đó không phải là trường hợp.
Asreerama

27

Trong Swift 3.0, sử dụng

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

Trong Siwft 5.0 + Sử dụng

let color = UIColor.lightText
let placeholder = textField.placeholder ?? "" //There should be a placeholder set in storyboard or elsewhere string or pass empty
textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [NSAttributedString.Key.foregroundColor : color])

24

Mã này đang hoạt động trong Swift3:

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

Hãy cho tôi biết nếu bạn có bất kỳ vấn đề.


vì một số lý do, sự cố này xảy ra khi tôi cố gắng thực hiện nhiều hơn 1 textField. Cái đầu tiên hoạt động tốt sau đó nó gặp sự cố trên tất cả các TextField tiếp theo. Không chắc chắn tại sao nhưng tôi ước tôi có thể sử dụng phương pháp này vì nó dễ nhất và dễ đọc nhất
Tommy K

Không cần sử dụng setValueđể truy cập vào một tài sản tư nhân. Sử dụng API công khai thích hợp.
rmaddy

Đây là câu trả lời tốt nhất ... Tnx rất nhiều.
reza_khalafi

Cú pháp Xcode 10 / Swift 5 theo nghĩa đen:#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
Lal Krishna

15

Để đặt màu giữ chỗ một lần cho tất cả các UITextFieldứng dụng trong ứng dụng của bạn, bạn có thể làm:

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

Điều này sẽ đặt màu mong muốn cho tất cả các TextFieldtrình giữ chỗ trong toàn bộ ứng dụng. Nhưng nó chỉ có sẵn kể từ iOS 9.

Không có phương thức xuất hiệnWhenContainedIn .... () trước iOS 9 trong swift nhưng bạn có thể sử dụng một trong các giải pháp được cung cấp ở đây xuất hiệnWhenContainedIn trong Swift


điều này sẽ thay đổi không chỉ màu giữ chỗ, mà cả màu văn bản.
Timur Suleimanov

7

Trong trường hợp của tôi, tôi sử dụng Swift 4

Tôi tạo tiện ích mở rộng cho 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 (màu: UIColor.white)


6

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!])
        }
    }
}

2
Điều này sẽ không làm việc. Các getter sẽ gây ra đệ quy vô hạn.
rmaddy

2
Điều này đang hoạt động tốt trong swift 4. Tôi đã tạo điểm dừng trong mã và kiểm tra nó .. đệ quy vô hạn không xảy ra.
R. Mohan

1
KHÔNG SỬ DỤNG NÀY. điều này sẽ dẫn đến đệ quy vô hạn. thử: in (textField.placeHolderColor)
David Rees

5

Swift 4:

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

Mục tiêu-C:

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

4

Đây là cách thực hiện nhanh chóng của tôi cho 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])
    }
}

sử dụng như:

streetTextField?.placeholderColor(AppColor.blueColor)

hy vọng nó sẽ giúp được ai đó!


Swift 4.2: self.attributionPlaceholder = NSAttributionString (chuỗi: placeholderText, thuộc tính: [NSAttributionString.Key.forgroundColor: color])
Sean Ở lại

4

Swift 3 (có thể là 2), bạn có thể ghi đè did set trên trình giữ chỗ trong UITextFieldlớp con để áp dụng thuộc tính trên nó, theo cách này:

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
    }
}

4

Dành cho Swift

Tạo tiện ích mở rộng UITextField

extension UITextField{

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

Nếu bạn được đặt từ bảng phân cảnh.

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!])
        }
    }
}

3

Đối với Swift 3 và 3.1, điều này hoạt động hoàn toàn tốt:

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

3

Đối với Swift 4.0, phiên bản X-code 9.1 hoặc iOS 11, bạn có thể sử dụng cú pháp sau để có màu giữ chỗ khác nhau

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

3

Tôi ngạc nhiên khi thấy có bao nhiêu giải pháp kém ở đây.

Đây là một phiên bản sẽ luôn luôn hoạt động.

Swift 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])
        }
    }
}

CHỈ DẪN : Nếu bạn thay đổi văn bản giữ chỗ sau khi đặt màu - màu sẽ được đặt lại.


3

Chỉ cần viết mã dưới đây vào phương thức didFinishLaunchingWithOptions của Appdelegate sử dụng điều này nếu bạn muốn thay đổi trong toàn bộ ứng dụng được viết trong Swift 4.2

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


1

Đối với swift 4.2 trở lên, bạn có thể làm như dưới đây:

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

1

Trong trường hợp của tôi, tôi đã làm như sau:

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])
            }
        }
    }
}

1

Ở đây tôi đang viết tất cả UIDesignable của UITextField. Với sự trợ giúp của mã này, bạn có thể truy cập trực tiếp từ Trình kiểm tra tệp UI trong bảng phân cảnh

@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!])
    }
}

}

0

Dành cho Swift

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

Bạn có thể sử dụng cái này;

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

0

Nó liên quan nhiều hơn đến việc cá nhân hóa văn bản của bạn nhưng dù sao tôi cũng sẽ chia sẻ mã này từ một trang khác và làm cho nó tốt hơn một chút:

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]
    )
  }
}

Và bạn có thể sử dụng nó như thế này:

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

Biết rằng bạn có một UITextField kết nối với a ViewController.

Nguồn: http://codepany.com/blog/swift-3-custom-uitextfield-with-single-line-input/


0

nhập mô tả hình ảnh ở đây

Đối với mục tiêu 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}];

Dành cho Swift :

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

0

Mã C khách quan để thay đổi màu văn bản giữ chỗ.

Đầu tiên nhập lớp objc / runtime này -

#import <objc/runtime.h>

sau đó thay thế tên trường văn bản của bạn -

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


0

cho 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;

}

0

Sử dụng như thế này trong Swift,

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

Trong mục tiêu C

NSString *placeHolder = [textField.placeholder length]>0 ? textField.placeholder: @"";
NSAttributedString *str = [[NSAttributedString alloc] initWithString:placeHolder attributes:@{ NSForegroundColorAttributeName : [UIColor lightGrayColor] }];
textField.attributedPlaceholder = str;

0
    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!])
                }
            } 
}

-1

Sử dụng công cụ này để thêm một trình giữ chỗ được quy cho:

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)

-1

Dành cho Swift 4

txtField1.attributedPlaceholder = NSAttributedString(string: "-", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])

1
Đây là một bản sao của một số câu trả lời trước đó. Không cần phải đăng câu trả lời trùng lặp.
rmaddy

-2
yourTextfield.attributedPlaceholder = NSAttributedString(string: "your placeholder text",attributes: [NSForegroundColorAttributeName: UIColor.white])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.