如何在保留现有属性的同时为UITextField设置占位符文本的颜色?

时间:2013-09-03 05:18:51

标签: ios uitextfield

我看到一些答案显示如何通过覆盖drawPlaceholderInRect:方法来更改UITextField的placeHolder文本颜色,如下所示:

iPhone UITextField - Change placeholder text color

但是这不会维护对齐,字体等现有属性......解决此问题的更好方法是什么?

5 个答案:

答案 0 :(得分:36)

从iOS 6开始,

如果没有任何子类化,可以使用几行代码完成此操作:

UIColor *color = [UIColor blackColor];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];

答案 1 :(得分:22)

有多种方法可以实现这一目标。

使用Interface Builder或Storyboard

  • 选择要更改占位符颜色的文本字段
  • 转到Xcode右上角的Identity检查器菜单
  • 以这种方式添加键值对

关键路径 = _placeholderLabel.textColor

单击“类型”并选择“颜色”属性。

然后选择值中的颜色。

enter image description here

使用代码设置占位符颜色:

流程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"];

Source

答案 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]
                                             }
 ];