利用runtime设置UITextField的Placehold

作者: MarkTang | 来源:发表于2016-03-17 12:05 被阅读221次
    • 首先我们通过打断点知道了textField中是有一个label的!
    Snip20160317_23.png

    也就是说有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

    相关文章

      网友评论

      • anddygon:这个想法很不错,但是一般我们设置的时候placeholder颜色设置都不是重要代码,一般我们会在XIB或者SB里设置好,所以支持xib和sb很有必要,也就是利用live rendering实现
        我试着实现了一下 效果不错
        extension UITextField {

        @IBInspectable var placeholderTextColor: UIColor {
        set {
        setValue(newValue, forKeyPath: "_placeholderLabel.textColor")
        }
        get {
        return (valueForKeyPath("_placeholderLabel.textColor") as? UIColor) ?? UIColor.lightGrayColor()
        }
        }

        }
        MarkTang:@NiePlus 这是KVC,这里运用runtime主要是可以先设置颜色再设置文字,不会拿不到这个label,只要单单的设置颜色用KVC就可以了.
        PlusNie:@Anddy_Gon
        不引入<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"];
        anddygon:@Anddy_Gon 而且这个方法亲测 不会被Apple拒绝

      本文标题:利用runtime设置UITextField的Placehold

      本文链接:https://www.haomeiwen.com/subject/zslclttx.html