我看到一些答案显示如何通过覆盖drawPlaceholderInRect:方法来更改UITextField的placeHolder文本颜色,如下所示:
iPhone UITextField - Change placeholder text color
但是这不会维护对齐,字体等现有属性......解决此问题的更好方法是什么?
答案 0 :(得分:36)
从iOS 6开始,
如果没有任何子类化,可以使用几行代码完成此操作:
UIColor *color = [UIColor blackColor];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
答案 1 :(得分:22)
有多种方法可以实现这一目标。
使用Interface Builder或Storyboard
关键路径 = _placeholderLabel.textColor
单击“类型”并选择“颜色”属性。
然后选择值中的颜色。
使用代码设置占位符颜色:
流程1:
[textField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"];
流程2:
覆盖drawPlaceholderInRect:(CGRect)rect方法
- (void) drawPlaceholderInRect:(CGRect)rect {
[[UIColor blueColor] setFill];
[[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:14]];
}
答案 2 :(得分:15)
现在确实有一种更好的方法可以解决这个问题。这适用于iOS 6和7。
(注意这个例子,我在AwakeFromNib中创建了代码,因为一旦设置它就不会改变颜色。但是如果你不使用XIB,你将不得不改变放置这段代码的位置,例如drawPlaceholderInRect,)
在这个例子中,我们创建了一个UITextField的子类,覆盖了awakeFromNib,然后将placeHolder文本颜色设置为红色:
- (void)awakeFromNib
{
if ([self.attributedPlaceholder length])
{
// Extract attributes
NSDictionary * attributes = (NSMutableDictionary *)[ (NSAttributedString *)self.attributedPlaceholder attributesAtIndex:0 effectiveRange:NULL];
NSMutableDictionary * newAttributes = [[NSMutableDictionary alloc] initWithDictionary:attributes];
[newAttributes setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];
// Set new text with extracted attributes
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:[self.attributedPlaceholder string] attributes:newAttributes];
}
}
这种方法的优点在于它维护了placeHolder字符串的当前UITextField属性,因此允许您在IB中设置大部分内容。此外,它比每次需要绘制时更有效率。它还允许您在placeHolder文本上更改任何其他属性,同时保留其余属性。
如上所述,如果不使用XIB,那么您需要在其他时间调用它。如果你把这段代码放在drawPlaceholderInRect:方法中,那么请确保在它的末尾调用[super drawPlaceholderInRect:]。
答案 3 :(得分:3)
自定义UITextField
占位符的安全方法是继承UITextField
并覆盖placeholderRectForBounds:
,Apple不会打扰您。但是,如果您想承担风险,可以尝试这种方式:
[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
答案 4 :(得分:0)
here See my output 这只是用于获取系统字体名称
for (NSString *familyName in [UIFont familyNames]) {
for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
NSLog(@"%@", fontName);
并将此代码添加到您的viewDidLoad
_textFieldEmail.attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"e-mail address"
attributes:@{
NSFontAttributeName : [UIFont fontWithName:@"Roboto-LightItalic" size:17.0]
}
];
_textFieldPassword.attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"password"
attributes:@{
NSFontAttributeName : [UIFont fontWithName:@"Roboto-LightItalic" size:17.0]
}
];