zoukankan      html  css  js  c++  java
  • 通过富文本改变UITextFieldPlaceholder颜色

    1、通过属性

    a、   //文字属性(一般)

        NSMutableDictionary *attrs = [NSMutableDictionary dictionary];

       attrs[NSForegroundColorAttributeName] = [UIColor blueColor];

      NSAttributedString *placeholderStr = [[NSAttributedString alloc] initWithString:@"手机号" attributes:attrs];

        self.phoneTextField.attributedPlaceholder = placeholderStr;

     b、稍微高级一点

        NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:@"手机号"];

        [placeholder setAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor],

                                     NSFontAttributeName : [UIFont systemFontOfSize:20]

                                     } range:NSMakeRange(0, 1)];

        [placeholder setAttributes:@{NSForegroundColorAttributeName : [UIColor blueColor]} range:NSMakeRange(1, 1)];

        [placeholder setAttributes:@{NSForegroundColorAttributeName : [UIColor yellowColor]} range:NSMakeRange(2, 1)];

        self.phoneTextField.attributedPlaceholder = placeholder;

     

    二、通过重写UITextField的方法

    继承UITextField的类,

    - (void)drawPlaceholderInRect:(CGRect)rect

    {

        [self.placeholder drawInRect:CGRectMake(10, 10, 10, 1) withAttributes:@{

                                                                               NSForegroundColorAttributeName :[UIColor blueColor],

                                                                               NSFontAttributeName :[UIFont systemFontOfSize:10]

                                                                               }];

    }

    使用的时候,如果是xib创建的textField,就吧xib中的textField的类名改成这个自定义的,如果是代码创建,就用这个自定义的textField去创建。

    三、或者在UITextField中放个label,输入时隐藏,也可以达到效果

    四、通过Runtime更改

     运行时(Runtime):

     * 苹果官方一套C语言库

     * 能做很多底层操作(比如访问隐藏的一些成员变量成员方法....)

     

    #import "LHBTestTextField.h"

    //要用运行时,必须导入该库

    #import <objc/runtime.h>

    static NSString * const LHBPlacerholderColorKeyPath = @"_placeholderLabel.textColor";

    @implementation LHBTestTextField

    //让代码创建的TextField的也可以用

    - (instancetype)initWithFrame:(CGRect)frame

    {

        if (self = [super initWithFrame:frame]) {

            

        }

        return self;

    }

     - (void)awakeFromNib

    {

    //    可以改

    //    UILabel *plcaeholderLabel = [self valueForKeyPath:@"_placeholderLabel"];

    //    plcaeholderLabel.textColor = [UIColor blueColor];

       

    //    或者一句代码

    //    [self setValue:[UIColor yellowColor] forKeyPath:@"_placeholderLabel.textColor"];

        

    //    设置光标颜色

    //    self.tintColor = [UIColor orangeColor];

    //    self.tintColor = self.textColor;//和文字颜色一致

            

        //RiderGirl中的应用

        [self resignFirstResponder];

        self.tintColor = [UIColor yellowColor];

    }

    #pragma mark - 当输入框聚焦时,调用,更改颜色。重写第一响应方法

    - (BOOL)becomeFirstResponder

    {

        //成为第一响应,就修改placeholder的文字颜色

        [self setValue:self.textColor forKeyPath:LHBPlacerholderColorKeyPath];

        return [super becomeFirstResponder];

    }

     

    #pragma mark - 当焦点离开输入框时,调用,更改颜色。重写失去焦点方法

    - (BOOL)resignFirstResponder

    {

        [self setValue:[UIColor grayColor] forKeyPath:LHBPlacerholderColorKeyPath];

        return [super resignFirstResponder];

    }

    + (void)initialize

    {

    //    [self getIvars];

    }

     

    + (void)getProperties

    {

        unsigned int count = 0;

        //相当于拷贝出来,要手动管理内存

        objc_property_t *propreties = class_copyPropertyList([UITextField class], &count);

        for (NSInteger i=0; i<count; i++) {

            //取出属性

            objc_property_t property = propreties[i];

            //打印属性名字

            NSLog(@"%s --- %s",property_getName(property),property_getAttributes(property));

        }

        //释放内存

        free(propreties);

     

    }

     

    + (void)getIvars

    {

        unsigned int count = 0;

        //相当于拷贝所有成员变量,要手动管理内存

        Ivar *ivars = class_copyIvarList([UITextField class], &count);

        for (NSInteger i=0; i<count; i++) {

            //取出成员变量

    //        Ivar ivar = *(ivars + i);

            Ivar ivar = ivars[i];//指向的是数组首元素时,可以当数组来用

           

            //打印一下看看UITextField里面隐藏的成员变量的名字

            NSLog(@"%s --- %s",ivar_getName(ivar),ivar_getTypeEncoding(ivar));

        }

        //释放内存

        free(ivars);

          //会打印出一堆成员变量的名字,拿到这个成员变量的名字,可以通过kvc来更改内部属性,现在可以拿到_placeholderLabel

    }

     

    #pragma mark - 该方法只能实现高亮时更改placeholder的颜色。焦点离开时暂时改不了

    //- (void)setHighlighted:(BOOL)highlighted

    //{

    //    [self setValue:self.textColor forKeyPath:LHBPlacerholderColorKeyPath];

    //}

     

     

    #pragma mark - 写框架的话,可以在外部加一属性,重写set方法,方便外部更改

     - (void)setPlaceholderColor:(UIColor *)placeholderColor

    {

        _placeholderColor = placeholderColor;

        [self setValue:placeholderColor forKeyPath:LHBPlacerholderColorKeyPath];

    }

  • 相关阅读:
    Promise前期准备---区别实例对象与函数对象
    es6之函数参数默认值、字符串方法、for of
    es6之剩余和扩展参数
    es6之解构赋值
    es6之set和map
    前端知识点总结
    jQuery的12种选择器
    前端面试总结
    Closure
    PHP 中 16 个魔术方法详解
  • 原文地址:https://www.cnblogs.com/sunflower-lhb/p/5573008.html
Copyright © 2011-2022 走看看