La modifica di un Testo Segnaposto di Colore con Swift

Ho un disegno che implementa un blu scuro UITextField, come il segnaposto di testo di default è di un colore grigio scuro riesco a malapena a capire che cosa il posto di titolare del testo dice.

Ho cercato su google il problema, naturalmente, ma devo ancora trovare una soluzione durante l’utilizzo di Swift lingua e non Obj-c.

C’è un modo per modificare il testo segnaposto di colore in un UITextField utilizzo di Swift?

 

27 Replies
  1. 430

    È possibile impostare il testo segnaposto utilizzando un attribuito stringa. Passa il colore che si desidera con il 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])

    Per Swift 3+ utilizza i seguenti:

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

    Per Swift 4.2 uso seguenti:

    myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text",
                                 attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
    • Funziona su iOS 7?
    • Non funziona sul mio simulatore di targeting 7+
    • iOS 11 SDK – la chiave non ha foregroundColor : self.emailTextField?.attributedPlaceholder = NSAttributedString(string: “testo segnaposto”, gli attributi: [NSAttributedStringKey.foregroundColor: UIColor.bianco])
    • Ho appena provato e funziona. Hai la versione di Xcode 9? Qual è il tipo di emailTextField ?
    • Grazie per lo scambio. Progetto di eredità, Aggiornato il mio Xcode da App store – Versione 9.0 (9A235), e, infine, si avvicinò con la soluzione di sé.passwordTextField?.attributedPlaceholder = NSAttributedString(string: “PASSWORD”, gli attributi: [NSForegroundColorAttributeName: UIColor.bianco])
    • per iOS 11 uso dell’SDK myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName: UIColor.white])
    • C’è un modo per impostare il colore senza impostare la stringa?
    • devi impostare il colore con la stringa. Se si desidera cambiare il colore di corrente attribuita stringa, ottenere la stringa corrente e usarla per crearne uno nuovo: myTextField.attributedPlaceholder = NSAttributedString(string: myTextField.attributedPlaceholder?.string ?? "", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
    • Sicuramente funziona per Swift 4.2

  2. 255

    È possibile eseguire questa operazione in modo rapido, senza aggiunta di una riga di codice, tramite Interface Builder.

    Selezionare il UITextField e aprire l’identità di ispezione sulla destra:

    La modifica di un Testo Segnaposto di Colore con Swift

    Fare clic sul pulsante più e aggiungere un nuovo runtime attributo:

    placeholderLabel.textColor (Swift 4)

    _placeholderLabel.textColor (Swift 3 o meno)

    Utilizzare Colore tipo e selezionare il colore.

    Che sia.

    Si suole vedere il risultato fino a quando si esegue la vostra app di nuovo.

    • vero, ma è un tipo di trucco, poiché il placeholderLabel.textColor proprietà è privata …
    • l’app essere respinto poiché stiamo usando una proprietà privata della classe?
    • Io non la penso così @firecast. Non ho sperimentato alcun rifiuto per l’implementazione di questa soluzione.
    • Purtroppo questo non sembra funzionare su iOS 10 almeno.
    • Non è vero. Destra ora l’ho testato su iOS 10.2.1 e funziona. 🙂
    • Strano. Potrebbe avere giurato di non (nota, non ritentare dopo).
    • non funzionerà per più textfield segnaposto???can u help me?
    • Cosa vuoi dire con “più textfiield” @Kiranjadhav? Si potrebbe definire il segnaposto per ogni textfield.
    • Buona strada a una chiusura inaspettata se Apple cambia implementazione interna .)
    • Incredibile soluzione. Grazie!
    • Di lavoro in 12 iOS, Xcode 10, il comune problema che ho affrontato dopo la connessione devo ri-collegare il controller di visualizzazione di nuovo per una visualizzazione specifica. quindi funziona, il problema economico è come sotto nome di errore: “questa classe non è valore della chiave di codifica conforme per la chiave di percorso chiave”
    • buon lavoro , il codice in esecuzione

  3. 115

    Creare UITextField Estensione come questa:

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

    E nel tuo storyboard o .xib. Vedrete

    La modifica di un Testo Segnaposto di Colore con Swift

    • ⚠️ Avviso: estensione crash il tuo programma dovrebbe mai decidere di leggere la proprietà placeHolderColor! Se si restituisce il valore di una calcolata struttura in sé, dalla proprietà getter getter sarà chiamato nuovamente nel getter, risultante in una ricorsione infinita. (Vedi: stackoverflow.com/a/42334711/2062785)
    • Per risolvere questo problema e di ottenere il comportamento previsto (cioè la corretta segnaposto di colore) di ottenere il attributedString‘s prima lettera (se non è vuoto) e ritorno il colore del testo, altrimenti nil.
  4. 25

    Questo codice funziona in Swift3:

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

    fatemi sapere se avete qualsiasi problema.

    • per qualche ragione, questa si blocca quando provo a farlo per più di 1 textField. Il primo funziona bene poi si blocca su tutti i successivi campi di testo. Non so perché, ma vorrei poter utilizzare questo metodo in quanto la sua è la più semplice e leggibile
    • Non c’è bisogno di utilizzare setValue per accedere a una proprietà privata. Uso corretto delle Api pubblica.
    • Questa è la migliore risposta…Tnx così tanto.
    • Xcode 10/Swift 5 letterale sintassi: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
  5. 22

    In Swift 3.0, Utilizzare

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

    Per impostare il colore segnaposto una volta per tutti i UITextField nella tua app si può fare:

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

    Questo imposta il colore desiderato per tutti TextField segnaposto in tutto l’app. Ma è disponibile solo a partire da iOS 9.

    Non c’è appearenceWhenContainedIn….() il metodo prima di iOS 9 in veloce, ma è possibile utilizzare una delle soluzioni fornite qui appearanceWhenContainedIn in Swift

    • questo cambia non solo segnaposto di colore, ma anche il colore del testo.
  7. 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!])
            }
        }
    }
    • Questo non funziona. Il getter causerà una ricorsione infinita.
    • Questo funziona bene in swift 4. Ho fatto il punto di interruzione nel codice e controllato..una ricorsione infinita, non sta accadendo.
    • NON UTILIZZARE QUESTO. questo si tradurrà in una ricorsione infinita. cerca: stampa(textField.placeHolderColor)
  8. 4

    Swift 3 (forse 2), è possibile eseguire l’override didSet sul segnaposto in UITextField sottoclasse di applicare attributo, in questo modo:

    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
        }
    }
  9. 3

    Per Swift 3 e 3.1 funziona perfettamente bene:

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

    Per Swift 4.0, X-code versione 9.1 o iOS 11 è possibile utilizzare la sintassi seguente per avere diverse segnaposto di colore

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

    Qui è la mia rapida attuazione per 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])
        }
    }

    utilizzo, come:

    streetTextField?.placeholderColor(AppColor.blueColor)

    speranza che aiuta qualcuno!

    • Swift 4.2: self.attributedPlaceholder = NSAttributedString(string: placeholderText, attributi: [NSAttributedString.Chiave.foregroundColor : colore])
  12. 3

    Swift 4 :

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

    Nel mio caso, io uso Swift 4

    Creare estensione per 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(colore: UIColor.bianco)

  14. 2

    Per Swift

    Creare UITextField Estensione

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

    Se Sono impostati da 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!])
            }
        }
    }
  15. 2

    Sono sorpreso di vedere quanti poveri soluzioni ci sono qui.

    Qui è una versione che funziona sempre.

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

    PUNTA: Se si modifica il testo segnaposto, dopo aver impostato il colore – il colore verrà ripristinato.

    • Funziona perfettamente.
  16. 1

    Per swift 4.2 e, soprattutto, si può fare, come di seguito:

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

    Nel mio caso, ho fatto le seguenti:

    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])
                }
            }
        }
    }
  18. 1

    Qui sto scrivendo tutto UIDesignable di UITextField. Con l’aiuto di questo codice, è possibile accedere direttamente dal file di interfaccia utente di Ispezione in storyboard

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

    Per Swift

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

    È possibile utilizzare questo;

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

    Più a personalizzare la tua textField ma comunque io condividere questo codice preso da un’altra pagina e fatto un po ‘ meglio:

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

    E si può usare come questa:

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

    Sapendo che si dispone di un UITextField collegato ad un ViewController.

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

  21. 0

    Basta scrivere il codice qui sotto in Appdelegate del didFinishLaunchingWithOptions metodo utilizzare questa opzione se si desidera modificare in tutta l’app scritto in Swift 4.2

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

    La modifica di un Testo Segnaposto di Colore con Swift

    Per Obiettivo 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}];

    Per Swift:

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

    Obiettivo C codice per modificare il testo segnaposto di colore.

    Prima di importare questo objc/classe runtime –

    HTML:

    #import <objc/runtime.h>

    sostituire le textfield nome –

    HTML:

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

  24. -1

    Utilizzare questo per l’aggiunta di un attribuiti segnaposto:

    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)
  25. -1

    Per Swift 4

    txtField1.attributedPlaceholder = NSAttributedString(string: "-", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
    • Questo è un duplicato di diverse risposte precedenti. Non c’è bisogno di postare le risposte duplicate.

Lascia un commento