有没有办法用 UIAppearance 设置 UITextField 的占位符颜色

Posted

技术标签:

【中文标题】有没有办法用 UIAppearance 设置 UITextField 的占位符颜色【英文标题】:Is there a way to set the placeholder color of a UITextField with UIAppearance 【发布时间】:2014-04-29 19:06:31 【问题描述】:

我发现我可以通过更改包含在UITextField 中的标签的textColor 来设置占位符颜色。

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor lightGrayColor]];

但这也会改变UITextField 文本颜色。有没有办法将它们与UIAppearance分开指定?

我尝试使用setValue:forKey:,但后来我读到我的应用可能因使用 KVC 而被拒绝。

【问题讨论】:

改用UITextFieldattributedPlaceholder 属性。 这很好但是必须在每个页面上正确设置一个函数?我在 appDelegate 中设置它,但我需要提供一个占位符字符串,它会覆盖我的占位符 是的,看看 UITextField 的构建方式,似乎没有办法通过外观选择器调整占位符颜色,这意味着您每次都必须这样做。在您的情况下,一个更简单的选择可能是子类化 UITextfield。然后,您可以通过覆盖初始化程序和其他适当的方法来执行您的标准自定义。 @Snymax 您可以在UITextField 上添加一个类别,以使用默认颜色设置attributedPlaceholder - 例如setDefaultStyledPlaceholder: Dima 我认为你是个天才谢谢你我不知道为什么我没想到 【参考方案1】:

在@Synmax 答案的基础上,我将这个类别放在一起,您可以使用它来向 UITextField 添加占位符文本颜色:

@interface UITextField (Placeholder)

@property UIColor* placeholderTextColor;

@end

@implementation UITextField (Placeholder)

-(UIColor*)placeholderTextColor 
    return [self.attributedPlaceholder attribute:NSForegroundColorAttributeName atIndex:0 effectiveRange:nil];


-(void)setPlaceholderTextColor:(UIColor*)placeholderTextColor 
    if(self.attributedPlaceholder) 
        NSMutableAttributedString* as = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedPlaceholder];
        if(placeholderTextColor) 
            [as setAttributes:[NSDictionary dictionaryWithObject:placeholderTextColor forKey:NSForegroundColorAttributeName] range:NSMakeRange(0, self.attributedPlaceholder.length)];
         else 
            [as removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, self.attributedPlaceholder.length)];
        
        self.attributedPlaceholder = as;
     else if(self.placeholder) 
        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:[NSDictionary dictionaryWithObject:placeholderTextColor forKey:NSForegroundColorAttributeName]];
    


@end

然后您可以使用这样的外观设置占位符文本颜色...

[UITextField appearance].placeholderTextColor = UIColor.grayColor;

【讨论】:

以上是关于有没有办法用 UIAppearance 设置 UITextField 的占位符颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIAppearance 代理设置 UILabel 样式

设置 UIAppearance 不会影响 cocoapod UI 组件

如何使用 UIAppearance 设置 ViewController 的 backgroundColor

UIAppearance

可以用 UIAppearance 来设置 UINavigationItem 的 titleview 吗?

检测自定义按钮的 UIAppearance 代理中的更改