- 首先我们通过打断点知道了textField中是有一个label的!
也就是说有setPlaceholder这个方法
下面我们就要利用runtime把我们写的方法和系统的setPlaceholder方法交换
首先新建一个UITextField的分类
然后
#import <objc/message.h>
//分类的代码
+ (void)load
{
Method placeholder = class_getInstanceMethod(self, @selector(setPlaceholder:));
Method placeBS_holder = class_getInstanceMethod(self, @selector(setBS_Placeholder:));
method_exchangeImplementations(placeholder, placeBS_holder);
}
//这是设置颜色的方法
- (void)setPlaceholderColor:(UIColor *)placeholderColor
{
//给系统的类增加一个属性,然后保存起来
objc_setAssociatedObject(self, "placeholderColor", placeholderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
UILabel *placeholder = [self valueForKey:@"placeholderLabel"];
placeholder.textColor = placeholderColor;
}
- (UIColor *)placeholderColor
{
return objc_getAssociatedObject(self, "placeholderColor");
}
//交换方法的实现
- (void)setBS_Placeholder:(NSString *)placeholder
{
//因为交换方法实现所以是调用了系统的方法
[self setBS_Placeholder:placeholder];
//再把颜色赋值
self.placeholderColor = self.placeholderColor;
}
- 然后外面调用的时候导入这个分类的就可以了
#import "UITextField+BS.h"
self.textadd.placeholderColor = [UIColor redColor];
self.textadd.placeholder = @"你喜欢什么颜色?";
最后的效果:
Snip20160317_24.png
网友评论
我试着实现了一下 效果不错
extension UITextField {
@IBInspectable var placeholderTextColor: UIColor {
set {
setValue(newValue, forKeyPath: "_placeholderLabel.textColor")
}
get {
return (valueForKeyPath("_placeholderLabel.textColor") as? UIColor) ?? UIColor.lightGrayColor()
}
}
}
不引入<object/message>也可以直接改变,尝试下下面的方法,但原理都是运用runtime
//提示字体颜色为白色
[self setValue:[UIColor colorWithRed:191.0/255.0 green:221.0/255.0 blue:245.0/255.0 alpha:1.0f] forKeyPath:@"_placeholderLabel.textColor"];
//提示字体大小
[self setValue:[UIFont boldSystemFontOfSize:16.0f] forKeyPath:@"_placeholderLabel.font"];