Swift ile Yer Tutucu Metin Rengini Değiştirme


226

Yer UITextFieldtutucu metin varsayılan olarak koyu gri renk olduğu için koyu mavi uygulayan bir tasarıma sahibim, ancak yer tutucu metnin ne dediğini zorlukla yapabilirim.

Elbette sorunu araştırdım ama henüz Swift dilini kullanırken bir çözüm bulamadım, Obj-c değil.

UITextFieldSwift kullanarak yer tutucu metin rengini değiştirmenin bir yolu var mı ?

Yanıtlar:


501

Yer tutucu metni, ilişkilendirilmiş bir dize kullanarak ayarlayabilirsiniz . İle istediğiniz rengi geçmek 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])

Swift 3+ için aşağıdakileri kullanın:

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

Swift 4.2 için aşağıdakileri kullanın:

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

iOS 11 SDK - anahtarda ön plan yokColor: self.emailTextField? .attributedPlaceholder = NSAttributedString (dize: "yer tutucu metni", özellikler: [NSAttributedStringKey.foregroundColor: UIColor.white])
Matthew Ferguson

@ MatthewFerguson, sadece denedim ve işe yarıyor. Xcode 9'un yayınlanmış sürümüne sahip misiniz? Ne tür emailTextField?
vacawama

2
@vacawama. Değişim için teşekkürler. Eski proje, Xcode'umu App Store'dan güncelledi - Sürüm 9.0 (9A235) ve sonunda self.passwordTextField? .AttributedPlaceholder = NSAttributedString (string: "PASSWORD", öznitelikleri ile geldi: [NSForegroundColorAttributeName: UIColor.white])
Matthew Ferguson

3
iOS 11 SDK kullanımı içinmyTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName: UIColor.white])
Gema Megantara

1
Dizeyi ayarlamadan rengi ayarlamanın bir yolu var mı?
ScottyBlades

286

Arabirim Oluşturucu'yu kullanarak bir kod satırı eklemeden bunu hızlı bir şekilde yapabilirsiniz.

UITextFieldSağdaki kimlik denetçisini seçin ve açın:

resim açıklamasını buraya girin

Artı düğmesini tıklayın ve yeni bir çalışma zamanı özelliği ekleyin:

placeholderLabel.textColor (Swift 4)

_placeholderLabel.textColor (Swift 3 veya daha az)

Tür olarak Renk'i kullanın ve rengi seçin.

Bu kadar.

Uygulamanızı tekrar çalışana kadar sonucu görmezsiniz.


1
true, ancak placeholderLabel.textColor özelliği özel olduğu için bir tür hack ...
Frédéric Adda

1
sınıfın özel bir özelliğini kullandığımız için uygulama reddedilecek mi?
firecast

2
Ne yazık ki bu en azından iOS 10'da çalışmıyor gibi görünüyor.
nickdnk

2
@nickdnk Doğru değil. Şu anda iOS 10.2.1'de test yaptım ve işe yarıyor. :)
Andrej

2
Apple dahili uygulamayı değiştirirse beklenmedik çökmelere iyi bir yol.)
Vlad

128

UITextFieldUzantıyı şu şekilde oluşturun :

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

Ve film şeridinizde veya .xib'de. Göreceksin

resim açıklamasını buraya girin


11
⚠️ Uyarı: Bu eklenti olacak çökmesine Hiç için karar vermelidir programınızı okumak özelliği placeHolderColor! Hesaplanan bir mülkün değerini mülkün alıcısından döndürürseniz, alıcı, alıcıdan tekrar çağrılarak sonsuz bir özyineleme elde edilir. (Bkz: stackoverflow.com/a/42334711/2062785 )
Mischa

1
Bunu düzeltmek ve beklenen davranışı (yani doğru yer tutucu rengini) elde etmek için attributedStringilk harfini (boş değilse) alın ve aksi takdirde metin rengini döndürün nil.
Mischa

Neden kutuda 2 renk gösteriliyor. Bunun karanlık mod için olduğunu düşündüm ama durum böyle değildi.
asreerama

27

Swift 3.0'da,

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

Siwft 5.0 + Kullanımında

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

Bu kod Swift3'te çalışıyor:

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

Herhangi bir sorunuz varsa bana bildirin.


nedense 1 den fazla textField yapmaya çalıştığınızda çöküyor. Birincisi iyi çalışıyor, ardından sonraki tüm textField'lerde çöküyor. Emin değilim ama keşke bu yöntemi en kolay ve en okunabilir beri kullanabilirsiniz
Tommy K

setValueÖzel bir mülke erişmek için kullanmaya gerek yoktur . Uygun genel API'ları kullanın.
rmaddy

Bu en iyi cevap ... Tnx çok fazla.
reza_khalafi

Xcode 10 / Swift 5 değişmez söz dizimi:#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
Lal Krishna

15

Uygulamanızdaki herkes için yer tutucu rengini bir kez ayarlamak için UITextFieldşunları yapabilirsiniz:

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

Bu TextField, tüm uygulamadaki tüm yer tutucular için istenen rengi ayarlayacaktır . Ancak yalnızca iOS 9'dan beri kullanılabilir.

Hiçbir appearenceWhenContainedIn .... () Swift iOS 9 öncesinde yöntemdir ancak çözümlerinden biri burada sağlanan kullanabilirsiniz Swift appearanceWhenContainedIn


bu yalnızca yer tutucu rengi değil metin rengini de değiştirir.
Timur Suleimanov

7

Benim durumumda Swift 4 kullanıyorum

UITextField için uzantı oluşturuyorum

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

Kalkan.placeholderColor (renk: 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
Bu işe yaramaz. Alıcı, sonsuz tekrarlamaya neden olacaktır.
rmaddy

2
Bu hızlı 4 iyi çalışıyor. Ben kod kesme noktası yaptı ve kontrol ... sonsuz özyineleme gerçekleşmiyor.
R. Mohan

1
BU KULLANMAYIN. bu sonsuz özyineleme ile sonuçlanacaktır. dene: yazdır (textField.placeHolderColor)
David Rees

5

Hızlı 4:

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

Amaç-C:

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

4

İşte hızlı 4 için hızlı uygulama:

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

gibi kullanın:

streetTextField?.placeholderColor(AppColor.blueColor)

umarım birine yardım eder!


Swift 4.2: self.attributedPlaceholder = NSAttributedString (dize: placeholderText, öznitelikler: [NSAttributedString.Key.foregroundColor: color])
Sean

4

Swift 3 (muhtemelen 2), UITextFieldöznitelik uygulamak için alt sınıftaki yer tutucudaki didSet'i şu şekilde geçersiz kılabilirsiniz :

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

Swift için

UITextField Uzantısı Oluşturun

extension UITextField{

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

Film şeridinden ayarlıysanız.

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

Swift 3 ve 3.1 için bu gayet iyi çalışıyor:

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

3

İçin Swift 4.0 X-kod 9.1 sürümü veya iOS 11 farklı tutucu renk için aşağıdaki sözdizimini kullanabilirsiniz

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

3

Burada kaç tane kötü çözüm olduğunu görünce şaşırdım.

İşte her zaman çalışacak bir sürüm.

Hızlı 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])
        }
    }
}

İPUCU : Rengi ayarladıktan sonra yer tutucu metni değiştirirseniz renk sıfırlanır.


3

Swift 4.2 ile yazılmış tüm uygulamada değişiklik yapmak istiyorsanız aşağıdaki kodu Appdelegate'in didFinishLaunchingWithOptions yöntemine yazmanız yeterlidir

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


1

Hızlı 4.2 ve üstü için aşağıdaki gibi yapabilirsiniz:

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

1

Benim durumumda, aşağıdakileri yaptım:

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

İşte tüm UITextField UIDesignable yazıyorum. Bu kod yardımıyla, doğrudan storyboard'daki UI dosya Denetçisi'nden erişebilirsiniz.

@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

Swift için

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

Bunu kullanabilirsiniz;

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

0

Daha fazla textField kişiselleştirmek hakkında ama yine de bu kodu başka bir sayfadan aldım ve biraz daha iyi hale getireceğim:

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

Ve bunu şöyle kullanabilirsiniz:

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

A ile UITextFieldbağlantılı olduğunuzu bilmek ViewController.

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


0

resim açıklamasını buraya girin

For Amaç 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}];

İçin Swift :

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

0

Yer tutucu metin rengini değiştirmek için objektif C kodu.

Önce bu objc / runtime sınıfını içe aktarın -

#import <objc/runtime.h>

sonra metin alanı adınızı değiştirin -

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


0

iOS13 için

+(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

Swift'te böyle kullanın,

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

Hedef 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

İlişkilendirilmiş bir yer tutucu eklemek için bunu kullanın:

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

Swift 4 için

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

1
Bu, daha önceki birkaç cevabın kopyasıdır. Yinelenen cevaplar göndermeye gerek yok.
rmaddy

-2
yourTextfield.attributedPlaceholder = NSAttributedString(string: "your placeholder text",attributes: [NSForegroundColorAttributeName: UIColor.white])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.