programing

iPhone UI 텍스트 필드 - 자리 표시자 텍스트 색상 변경

stoneblock 2023. 5. 9. 22:01

iPhone UI 텍스트 필드 - 자리 표시자 텍스트 색상 변경

플레이스홀더 텍스트의 색상을 변경하고 싶습니다.UITextField컨트롤, 검은색으로 만듭니다.

일반 텍스트를 자리 표시자로 사용하지 않고 자리 표시자의 동작을 모방하는 모든 방법을 재정의하지 않고 이 작업을 수행하고 싶습니다.

만약 내가 이 방법을 무효화한다면,

- (void)drawPlaceholderInRect:(CGRect)rect

그러면 제가 이걸 할 수 있을 거예요.그러나 이 메서드 내에서 실제 자리 표시자 개체에 액세스하는 방법을 잘 모르겠습니다.

iOS 6의 UIView에 속성 문자열이 도입된 이후로 자리 표시자 텍스트에 다음과 같은 색상을 지정할 수 있습니다.

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}

쉽고 통증이 없는 것은 어떤 사람들에게는 쉬운 대안이 될 수 있습니다.

_placeholderLabel.textColor

생산을 위해 제안되지 않은 경우, Apple은 사용자의 제출을 거부할 수 있습니다.

오버라이드할 수 있습니다.drawPlaceholderInRect:(CGRect)rect자리 표시자 텍스트를 수동으로 렌더링할 경우:

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}

이것은 Swift < 3.0:

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

iOS 8.2 및 iOS 8.3 베타 4에서 테스트되었습니다.

스위프트 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

스위프트 4:

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

Swift 4.2:

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

아래 코드를 사용하여 자리 표시자 텍스트 색상을 원하는 색상으로 변경할 수 있습니다.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];

이러한 방법을 시도하고 싶겠지만 Apple이 개인 ivar에 액세스하는 것에 대해 경고할 수 있습니다.

[self.myTextField setValue:[UIColor darkGrayColor] 
                forKeyPath:@"_placeholderLabel.textColor"];

NOTE
Martin Alléus에 따르면 이것은 iOS 7에서 더 이상 작동하지 않습니다.

Swift 3.0 + 스토리보드

스토리보드에서 자리 표시자 색을 변경하려면 다음 코드로 확장명을 작성합니다.(이 코드를 업데이트하는 것이 더 명확하고 안전할 수 있다고 생각한다면 자유롭게 업데이트하십시오.)

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

여기에 이미지 설명 입력

스위프트 4 버전

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

스위프트 5 버전

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

Swift에서:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

Swift 4.0의 경우:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}

다음은 iOS6+에서만 가능합니다(Alexander W의 설명에 나와 있음).

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];

저는 이미 이 문제에 직면해 있었습니다.저의 경우 아래 코드가 맞습니다.

목표 C

[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

스위프트 4를 위하여.x

tf_mobile.setValue(UIColor.white, forKeyPath: "_placeholderLabel.textColor")

iOS 13용 스위프트 코드

tf_mobile.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

iOS 13에 대해서도 아래 코드를 사용할 수 있습니다.

let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(tf_mobile, iVar) as! UILabel
placeholderLabel.textColor = .red

호프, 이게 도움이 될 수도 있어요

이를 통해 iOS에서 텍스트 필드의 자리 표시자 텍스트 색상을 변경할 수 있습니다.

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];

신속하게 3.x

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])

신속하게 5.

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

그냥 사용하는 게 어때요?UIAppearance방법:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];

스토리보드에서도 코드 한 줄 없이

여기에 이미지 설명 입력

iOS 6.0 +의 경우

[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

도움이 되길 바랍니다.

참고: 당사가 개인 API에 액세스하고 있기 때문에 Apple이 귀하의 앱을 거부할 수 있습니다(0.01% 확률).저는 2년 전부터 모든 프로젝트에 이것을 사용하고 있지만, 애플은 이것을 요청하지 않았습니다.

사마린.i.OS 개발자 여러분, 이 문서에서 찾았습니다. https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });

빠른 버전.아마도 누군가에게 도움이 될 것입니다.

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}

6 은 iOS 6을 제공합니다.attributedPlaceholderUITextField 3은 iOS 3.2를 제공합니다.setAttributes:range:NSMutableAttributedString.

다음 작업을 수행할 수 있습니다.

NSMutableAttributedString *ms = [[NSMutableAttributedString alloc] initWithString:self.yourInput.placeholder];
UIFont *placeholderFont = self.yourInput.font;
NSRange fullRange = NSMakeRange(0, ms.length);
NSDictionary *newProps = @{NSForegroundColorAttributeName:[UIColor yourColor], NSFontAttributeName:placeholderFont};
[ms setAttributes:newProps range:fullRange];
self.yourInput.attributedPlaceholder = ms;

iOS7에서 수직 및 수평 정렬과 자리 표시자 색상을 모두 처리하려면, InRect를 그리고 점에서 더 이상 현재 컨텍스트 채우기 색상을 사용하지 않습니다.

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

오브제이-C

@interface CustomPlaceHolderTextColorTextField : UITextField

@end


@implementation CustomPlaceHolderTextColorTextField : UITextField


-(void) drawPlaceholderInRect:(CGRect)rect  {
    if (self.placeholder) {
        // color of placeholder text
        UIColor *placeHolderTextColor = [UIColor redColor];

        CGSize drawSize = [self.placeholder sizeWithAttributes:[NSDictionary dictionaryWithObject:self.font forKey:NSFontAttributeName]];
        CGRect drawRect = rect;

        // verticially align text
        drawRect.origin.y = (rect.size.height - drawSize.height) * 0.5;

        // set alignment
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = self.textAlignment;

        // dictionary of attributes, font, paragraphstyle, and color
        NSDictionary *drawAttributes = @{NSFontAttributeName: self.font,
                                     NSParagraphStyleAttributeName : paragraphStyle,
                                     NSForegroundColorAttributeName : placeHolderTextColor};


        // draw
        [self.placeholder drawInRect:drawRect withAttributes:drawAttributes];
    }
}

@end

Swift 4.1용 솔루션

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])

범주 FTW.효과적인 색상 변경을 확인할 수 있도록 최적화할 수 있습니다.


#import <UIKit/UIKit.h>

@interface UITextField (OPConvenience)

@property (strong, nonatomic) UIColor* placeholderColor;

@end

#import "UITextField+OPConvenience.h"

@implementation UITextField (OPConvenience)

- (void) setPlaceholderColor: (UIColor*) color {
    if (color) {
        NSMutableAttributedString* attrString = [self.attributedPlaceholder mutableCopy];
        [attrString setAttributes: @{NSForegroundColorAttributeName: color} range: NSMakeRange(0,  attrString.length)];
        self.attributedPlaceholder =  attrString;
    }
}

- (UIColor*) placeholderColor {
    return [self.attributedPlaceholder attribute: NSForegroundColorAttributeName atIndex: 0 effectiveRange: NULL];
}

@end

주의사항이 있는 스위프트 5.

let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.someColor ]
let placeHolderString = NSAttributedString(string: "DON'T_DELETE", attributes: attributes)
txtField.attributedPlaceholder = placeHolderString

.String여기서 "DON'T_DELETE"는 해당 문자열이 다른 곳에서 코드로 설정된 경우에도 해당됩니다.머리를 긁는 데 5분을 절약할 수 있을 겁니다.

  • 하위 분류의 경우 반드시 layoutSubviews(init가 아님)에서 수행해야 합니다.

  • 을 지울 가 없습니다.placeholder그것은 그림을 그리지 않는 것을 압니다.placeholder지정된 자리 표시자를 사용하는 경우.

재정의 중drawPlaceholderInRect:올바른 방법이지만 API(또는 설명서)의 버그로 인해 작동하지 않습니다.

에 .UITextField.

참고 항목UITextField에서 호출되지 않은 TextInRect 그리기

Digdog의 솔루션을 사용할 수 있습니다.Apple 리뷰를 통과할 수 있을지 확신할 수 없기 때문에 다른 솔루션을 선택했습니다.자리 표시자 동작을 모방하는 사용자 레이블로 텍스트 필드를 오버레이합니다.

좀 지저분하긴 한데요.코드는 다음과 같습니다(참고로 TextField의 하위 클래스 내에서 이 작업을 수행하고 있습니다).

@implementation PlaceholderChangingTextField

- (void) changePlaceholderColor:(UIColor*)color
{    
    // Need to place the overlay placeholder exactly above the original placeholder
    UILabel *overlayPlaceholderLabel = [[[UILabel alloc] initWithFrame:CGRectMake(self.frame.origin.x + 8, self.frame.origin.y + 4, self.frame.size.width - 16, self.frame.size.height - 8)] autorelease];
    overlayPlaceholderLabel.backgroundColor = [UIColor whiteColor];
    overlayPlaceholderLabel.opaque = YES;
    overlayPlaceholderLabel.text = self.placeholder;
    overlayPlaceholderLabel.textColor = color;
    overlayPlaceholderLabel.font = self.font;
    // Need to add it to the superview, as otherwise we cannot overlay the buildin text label.
    [self.superview addSubview:overlayPlaceholderLabel];
    self.placeholder = nil;
}

저는 xcode를 처음 접했고 같은 효과를 낼 수 있는 방법을 찾았습니다.

원하는 형식의 자리 표시자 위치에 uilabel을 배치하고 숨깁니다.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    switch (textField.tag)
    {
        case 0:
            lblUserName.hidden=YES;
            break;

        case 1:
            lblPassword.hidden=YES;
            break;
 
        default:
            break;
    }
}

실제 솔루션이 아닌 해결책이라는 데 동의하지만 이 링크에서 얻은 효과는 동일합니다.

참고: iOS 7에서도 작동합니다 :|

iOS7 이하에서 할 수 있는 최선의 방법은 다음과 같습니다.

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)textRectForBounds:(CGRect)bounds {
  CGRect rect = CGRectInset(bounds, 0, 6); //TODO: can be improved by comparing font size versus bounds.size.height
  return rect;
}

- (void)drawPlaceholderInRect:(CGRect)rect {
  UIColor *color =RGBColor(65, 65, 65);
  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName:self.font, UITextAttributeTextColor:color}];
  } else {
    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font];
  }
}

모노터치(Xamarin.i)를 사용하는 경우OS), C#로 번역된 Adam의 답변은 다음과 같습니다.

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}

다중 색상으로 속성 텍스트 필드 자리 표시자를 설정하는 경우,

텍스트를 지정하면 됩니다.

  //txtServiceText is your Textfield
 _txtServiceText.placeholder=@"Badal/ Shah";
    NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:_txtServiceText.placeholder];
     [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor whiteColor] range:[_txtServiceText.placeholder rangeOfString:@"Badal/"]]; //Replace it with your first color Text
    [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor orangeColor] range:[_txtServiceText.placeholder rangeOfString:@"Shah"]]; // Replace it with your secondcolor string.
    _txtServiceText.attributedPlaceholder=mutable;

출력 :-

여기에 이미지 설명 입력

나는 자리 표시자 정렬을 유지해야 했기 때문에 아담의 답변이 나에게 충분하지 않았습니다.

이 문제를 해결하기 위해 저는 여러분 중 일부에게도 도움이 되기를 바라는 작은 변형을 사용했습니다.

- (void) drawPlaceholderInRect:(CGRect)rect {
    //search field placeholder color
    UIColor* color = [UIColor whiteColor];

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];

하위 분류가 필요하지 않은 다른 선택사항 - 자리 표시자를 공백으로 두고 편집 단추 위에 레이블을 놓습니다.자리 표시자를 관리하는 것과 마찬가지로 레이블을 관리합니다(사용자가 입력한 내용을 모두 지웁니다...).

언급URL : https://stackoverflow.com/questions/1340224/iphone-uitextfield-change-placeholder-text-color