20

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

iPhone UITextField - 更改占位符文本颜色

但这不保持现有的属性,如对齐、字体等......有什么更好的方法来解决这个问题?

4

5 回答 5

36

从 iOS 6 开始,

没有任何子类化,可以用几行代码来完成,如下所示:

UIColor *color = [UIColor blackColor];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
于 2013-12-13T15:10:37.723 回答
22

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

使用 Interface Builder 或 Storyboard

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

关键路径=_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]];
}
于 2016-02-25T12:51:19.687 回答
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:]。

于 2013-09-03T05:18:50.777 回答
3

UITextField自定义占位符的安全方法是继承UITextField和覆盖placeholderRectForBounds:,Apple 不会在这方面打扰您。但是,如果您想冒险,可以尝试以下方式:

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

来源

于 2013-09-03T05:35:13.373 回答
0

在这里查看我的输出这只是为了获取系统字体名称

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]
                                             }
 ];
于 2018-10-28T03:31:01.243 回答