我已经看到了一些答案,这些答案显示了如何通过覆盖 drawPlaceholderInRect: 方法来更改 UITextField 的 placeHolder 文本颜色,例如:
iPhone UITextField - 更改占位符文本颜色
但这不保持现有的属性,如对齐、字体等......有什么更好的方法来解决这个问题?
我已经看到了一些答案,这些答案显示了如何通过覆盖 drawPlaceholderInRect: 方法来更改 UITextField 的 placeHolder 文本颜色,例如:
iPhone UITextField - 更改占位符文本颜色
但这不保持现有的属性,如对齐、字体等......有什么更好的方法来解决这个问题?
从 iOS 6 开始,
没有任何子类化,可以用几行代码来完成,如下所示:
UIColor *color = [UIColor blackColor];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
有多种方法可以实现这一目标。
使用 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]];
}
现在确实有更好的方法来处理这个问题。这适用于 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:]。
UITextField
自定义占位符的安全方法是继承UITextField
和覆盖placeholderRectForBounds:
,Apple 不会在这方面打扰您。但是,如果您想冒险,可以尝试以下方式:
[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
来源。
在这里查看我的输出这只是为了获取系统字体名称
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]
}
];