답변:
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.
}
attributedPlaceholder
색상을 제외한 텍스트 속성을 사용합니다.
[[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
쉽고 통증이 없으며 일부에게는 쉬운 대안이 될 수 있습니다.
_placeholderLabel.textColor
프로덕션 용으로 제안되지 않은 Apple은 제출을 거부 할 수 있습니다.
_placeholderLabel
는 개인 재산입니다. 이 솔루션은 개인 API 사용으로 거부 될 수 있습니다.
drawPlaceholderInRect:(CGRect)rect
자리 표시 자 텍스트를 수동으로 렌더링하도록 재정의 할 수 있습니다 .
- (void) drawPlaceholderInRect:(CGRect)rect {
[[UIColor blueColor] setFill];
[[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}
[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
아마 더 좋다. 그렇게하면 textAlignment
재산 을 존중하게 됩니다. SSTextField 클래스 에 이것을 추가했습니다 . 프로젝트에서 자유롭게 사용하십시오.
아래 코드를 사용하여 자리 표시 자 텍스트 색상을 원하는 색상으로 변경할 수 있습니다.
UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];
아마도 이런 식으로 시도하고 싶지만 Apple은 개인 ivar에 액세스하는 것에 대해 경고 할 수 있습니다
[self.myTextField setValue:[UIColor darkGrayColor]
forKeyPath:@"_placeholderLabel.textColor"];
참고
Martin Alléus에 따르면 iOS 7에서는 더 이상 작동하지 않습니다.
Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug
😈
이것은 스위프트 <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])
스위프트 4.2 :
myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
스위프트에서 :
if let placeholder = yourTextField.placeholder {
yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder,
attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}
스위프트 4.0에서 :
if let placeholder = yourTextField.placeholder {
yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder,
attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}
스토리 보드에서 자리 표시 자 색상을 변경하려면 다음 코드로 확장을 만듭니다. (이 코드를 업데이트하면 더 명확하고 안전 할 수 있습니다).
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)
}
}
}
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)
}
}
}
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)
}
}
}
NSAttributedStringKey
.
다음은 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
희망이 도움이 될 수 있습니다.
viewWillAppear
또는 에서이 변경을 수행해야한다는 사실을 배우기에는 너무 오래 걸렸습니다 viewDidAppear
. viewDidLoad
너무 빠릅니다.
이를 통해 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])
Xamarin.iOS 개발자의 경우이 문서 https://developer.xamarin.com/api/type/Foundation.NSAttributedString/ 에서 찾았습니다.
textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor = UIColor.Red });
new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
카테고리 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
iOS7에서 자리 표시 자의 색상뿐만 아니라 세로 및 가로 정렬을 모두 처리합니다. drawInRect 및 drawAtPoint는 더 이상 현재 컨텍스트 fillColor를 사용하지 않습니다.
오브제 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
iOS 6 이상은에서 제공 attributedPlaceholder
합니다 UITextField
. 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;
재정의 drawPlaceholderInRect:
는 올바른 방법이지만 API (또는 설명서)의 버그로 인해 작동하지 않습니다.
이 메소드는에서 호출되지 않습니다 UITextField
.
호출되지 않은 UITextField의 drawTextInRect 도 참조하십시오.
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에서 작동합니다 : |
주의 사항 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 분의 헤드 스크래칭을 줄일 수 있습니다.
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];
}
}
Monotouch (Xamarin.iOS)를 사용하는 사람들을 위해 다음은 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);
}
}
Font
텍스트 필드 속성 에서 글꼴 세트를 사용하는 것이 더 좋습니다 .
자리 표시 자 정렬을 유지해야 아담의 대답이 충분하지 않았습니다.
이 문제를 해결하기 위해 작은 변형을 사용하여 일부 사용자에게 도움이되기를 바랍니다.
- (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];
}
UILineBreakModeTailTruncation
iOS 6
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
다중 색상으로 속성이 지정된 텍스트 필드 자리 표시자를 설정하려면
Text를 지정하십시오.
//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;
출력 :-
서브 클래 싱이 필요하지 않은 또 다른 옵션-자리 표시자를 비워두고 편집 단추 위에 레이블을 붙입니다. 플레이스 홀더를 관리하는 것처럼 레이블을 관리하십시오 (사용자가 입력 한 내용을 지우면 ..)