Swift로 자리 표시 자 텍스트 색상 변경


226

UITextField자리 표시 자 텍스트는 기본적으로 어두운 회색이므로 자리 표시 자 텍스트의 내용을 거의 알아낼 수 없으므로 짙은 파란색을 구현하는 디자인이 있습니다.

물론 문제를 봤지만 Swift 언어를 사용하는 동안 Obj-c가 아닌 해결책을 찾지 못했습니다.

UITextField스위프트를 사용하여 자리 표시 자 텍스트 색상을 변경하는 방법이 있습니까?

답변:


501

당신은 사용하여 자리 표시 자 텍스트를 설정할 수 있습니다 기인 문자열 . 원하는 색상을 전달하십시오 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+의 경우 다음을 사용하십시오.

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

Swift 4.2의 경우 다음을 사용하십시오.

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

iOS 11 SDK-키에 foregroundColor가 없습니다. self.emailTextField? .attributedPlaceholder = NSAttributedString (string : "placeholder text", 속성 : [NSAttributedStringKey.foregroundColor : UIColor.white])
Matthew Ferguson

@ MatthewFerguson, 방금 시도해 보았습니다. Xcode 9의 출시 버전이 있습니까? 유형은 emailTextField무엇입니까?
vacawama

2
@vacawama. 교환 주셔서 감사합니다. 레거시 프로젝트, App Store-버전 9.0 (9A235)에서 Xcode를 업데이트하고 마지막으로 self.passwordTextField? .attributedPlaceholder = NSAttributedString (string : "PASSWORD", 속성 : [NSForegroundColorAttributeName : UIColor.white]의 솔루션을 찾았습니다.)
Matthew Ferguson

3
iOS 11 SDK 용myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName: UIColor.white])
Gema Megantara

1
문자열을 설정하지 않고 색상을 설정하는 방법이 있습니까?
ScottyBlades

285

Interface Builder를 사용하면 코드를 추가하지 않고도이 작업을 신속하게 수행 할 수 있습니다.

를 선택하고 UITextField오른쪽에서 신원 관리자를 엽니 다.

여기에 이미지 설명을 입력하십시오

더하기 버튼을 클릭하고 새로운 런타임 속성을 추가하십시오.

placeholderLabel.textColor (Swift 4)

_placeholderLabel.textColor (Swift 3 이하)

색상 을 유형으로 사용하고 색상 을 선택하십시오.

그게 다야.

앱을 다시 실행할 때까지 결과가 표시되지 않습니다.


1
placeholderLabel.textColor 속성이 비공개이기 때문에 사실 일종의 해킹입니다.
Frédéric Adda

1
클래스의 개인 속성을 사용하고 있기 때문에 앱이 거부됩니까?
firecast

2
불행히도 이것은 iOS 10에서 적어도 작동하지 않는 것 같습니다.
nickdnk

2
@nickdnk 사실이 아닙니다. 지금은 iOS 10.2.1에서 테스트했으며 작동합니다. :)
Andrej

2
애플이 내부 구현을 변경하면 예기치 않은 충돌로가는 좋은 길.)
Vlad

127

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

그리고 스토리 보드 또는 .xib에서. 당신은 볼 것이다

여기에 이미지 설명을 입력하십시오


11
⚠️ 경고 : 이 확장 프로그램은 속성 을 읽기로 결정한 경우 프로그램 을 중단 시킵니다 ! 속성의 getter에서 계산 된 속성 값을 반환하면 getter 내에서 getter가 다시 호출되어 무한 재귀가 발생합니다. (참조 : stackoverflow.com/a/42334711/2062785 )placeHolderColor
Mischa

1
이 문제를 해결하고 예상되는 동작 (예 : 올바른 자리 표시 자 색)을 얻으려면 attributedString첫 번째 문자 (비어 있지 않은 경우 )를 가져 와서 텍스트 색을 반환하십시오 nil.
Mischa

왜 상자에 두 가지 색상이 표시됩니까? 나는 이것이 어두운 모드라고 생각했지만 사실은 아닙니다.
asreerama

27

Swift 3.0에서는

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

Siwft 5.0 이상 + 사용

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

이 코드는 Swift3에서 작동합니다.

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

문제가 있으면 알려주세요.


여러 가지 이유로 textField 이상으로하려고하면 충돌이 발생합니다. 첫 번째는 잘 작동하고 모든 후속 텍스트 필드에서 충돌합니다. 이유는 확실하지 않지만 가장 쉽고 읽기 쉬운이 방법을 사용할 수 있기를 바랍니다.
Tommy K

setValue개인 재산에 액세스 하기 위해 사용할 필요는 없습니다 . 적절한 공개 API를 사용하십시오.
rmaddy

이것이 가장 좋은 대답입니다 ... Tnx 너무.
reza_khalafi

Xcode 10 / Swift 5 리터럴 구문 :#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
Lal Krishna

15

UITextField앱에서 모든 자리 표시 자 색상을 한 번 설정하려면 다음을 수행하십시오.

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

TextField전체 앱의 모든 자리 표시 자에 원하는 색상이 설정 됩니다. 그러나 iOS 9부터 사용할 수 있습니다.

iOS 9 이전에는 신속하게 appearenceWhenContainedIn .... () 메소드가 없지만 여기에 제공된 솔루션 중 하나 를 Swift에서 사용할 수 있습니다.


플레이스 홀더 색상뿐만 아니라 텍스트 색상도 변경됩니다.
Timur Suleimanov

7

제 경우에는 Swift 4를 사용합니다

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 (색상 : UIColor.white)


6

Xcode 9.2 스위프트 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
작동하지 않습니다. 게터는 무한 재귀를 일으킬 것입니다.
rmaddy

2
이것은 빠른 4에서 잘 작동합니다. 코드에서 중단 점을 만들고 확인했습니다 .. 무한 재귀가 발생하지 않습니다.
R. Mohan

1
이것을 사용하지 마십시오. 이로 인해 무한 재귀가 발생합니다. 시도 : print (textField.placeHolderColor)
David Rees

5

스위프트 4 :

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

목표 -C :

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

4

신속한 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])
    }
}

다음과 같이 사용하십시오.

streetTextField?.placeholderColor(AppColor.blueColor)

그것이 누군가를 돕기를 바랍니다!


스위프트 4.2 self.attributedPlaceholder = NSAttributedString은 (문자열 : placeholderText, 속성 [NSAttributedString.Key.foregroundColor : 컬러])
숀 Stayns

4

스위프트 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
    }
}

4

스위프트

UITextField 확장 만들기

extension UITextField{

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

스토리 보드에서 설정 한 경우

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 및 3.1의 경우 완벽하게 작동합니다.

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

3

들어 스위프트 4.0, X 코드 9.1 버전 또는 iOS (11) 는 다른 자리 색상을 가지고 다음과 같은 구문을 사용할 수 있습니다

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

3

여기에 몇 가지 가난한 솔루션이 있는지 놀랐습니다.

다음은 항상 작동하는 버전입니다.

스위프트 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])
        }
    }
}

: 색상을 설정 한 후 자리 표시 자 텍스트를 변경하면 색상이 재설정됩니다.


3

Swift 4.2로 작성된 전체 앱을 변경하려면 Appdelegate의 didFinishLaunchingWithOptions 메소드에 아래 코드를 작성하십시오.

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


1

신속한 4.2 이상에서는 다음과 같이 할 수 있습니다.

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

1

제 경우에는 다음을 수행했습니다.

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

여기 UITextField의 모든 UIDesignable을 작성하고 있습니다. 이 코드를 사용하면 스토리 보드의 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!])
    }
}

}

0

스위프트

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

이것을 사용할 수 있습니다.

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

0

그것은 당신의 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]
    )
  }
}

그리고 당신은 이것을 다음과 같이 사용할 수 있습니다 :

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

UITextField연결되어 있음을 알고 있습니다 ViewController.

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


0

여기에 이미지 설명을 입력하십시오

대한 목표 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}];

대한 스위프트 :

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

0

자리 표시 자 텍스트 색상을 변경하기위한 목표 C 코드.

먼저이 objc / 런타임 클래스를 가져옵니다.

#import <objc/runtime.h>

그런 다음 텍스트 필드 이름을 바꾸십시오.

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


0

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

스위프트에서 이와 같이 사용하십시오.

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

목표 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

중요한 자리 표시자를 추가 할 때 사용하십시오.

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

스위프트 4

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

1
이것은 몇 가지 이전 답변의 복제본입니다. 중복 답변을 게시 할 필요가 없습니다.
rmaddy

-2
yourTextfield.attributedPlaceholder = NSAttributedString(string: "your placeholder text",attributes: [NSForegroundColorAttributeName: UIColor.white])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.