• ios_UITextField-修改占位文字和光标的颜色,大小


    一.设置占位文字的颜色

    方法一:利用富文本

    /** 手机号输入框 */
    @property (weak, nonatomic) IBOutlet UITextField *phoneTextField;
     
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 创建一个富文本对象
        NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
        // 设置富文本对象的颜色
        attributes[NSForegroundColorAttributeName] = [UIColor whiteColor];
        // 设置UITextField的占位文字
        self.phoneTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"手机号" attributes:attributes];
     
    }

    方法二:利用Runtime获取私有的属性名称,利用KVC设置属性

    // 设置占位文字的颜色为红色(注意下面的'self'代表你要修改占位文字的UITextField控件)
    [self setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
    • 注意:_placeholderLabel.textColor是不可乱写的哦,我们是怎么获取到这个属性的呢?请看下文:
      // 只调用一次(自定义UITextField)
      + (void)initialize {
       
          [self getIvars];
       
      }
       
      // 获取私有变量名称
      + (void)getIvars {
       
          unsigned int count = 0;
       
          Ivar *ivars = class_copyIvarList([UITextField class], &count);
       
          for (int i = 0; i < count; i++) {
              Ivar ivar = ivars[i];
       
              NSLog(@"%s----%s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
          }
      }

      查看打印,找出可能的属性名称,试试便知;

      • 完整代码:自定义的UITextField,获取到焦点(编辑状态)的时候是白色,失去焦点(非编辑状态)的时候是灰色:
        #import "YCTextField.h"
        #import <objc/runtime.h>
         
        #define YCplaceholderTextColor @"_placeholderLabel.textColor"
         
        @implementation YCTextField
         
        + (void)initialize {
         
            [self getIvars];
         
        }
         
        // 获取私有变量名称
        + (void)getIvars {
         
            unsigned int count = 0;
         
            Ivar *ivars = class_copyIvarList([UITextField class], &count);
         
            for (int i = 0; i < count; i++) {
                Ivar ivar = ivars[i];
         
                NSLog(@"%s----%s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
            }
        }
         
        - (void)awakeFromNib {
         
            // 设置光标的颜色
            self.tintColor = self.textColor;
        }
         
        // 获取到焦点
        - (BOOL)becomeFirstResponder {
         
            // 利用运行时获取key,设置占位文字的颜色
            [self setValue:self.textColor forKeyPath:YCplaceholderTextColor];
         
            return [super becomeFirstResponder];
        }
         
        // 失去焦点
        - (BOOL)resignFirstResponder {
         
            // 利用运行时获取key,设置占位文字的颜色
            [self setValue:[UIColor grayColor] forKeyPath:YCplaceholderTextColor];
         
            return [super resignFirstResponder];
        }
         
        @end

        方法三.将占位文字上去(重写- (void)drawPlaceholderInRect:(CGRect)rect;)

        - (void)drawPlaceholderInRect:(CGRect)rect
        {
         
            [[UIColor orangeColor] set];
         
            [self.placeholder drawInRect:rect withFont:[UIFont systemFontOfSize:20]];
        }

        二.设置光标颜色

        // 设置光标的颜色
        self.tintColor = [UIColor redColor];

        三.设置占位文字的偏移

        • 重写-(CGRect)placeholderRectForBounds:(CGRect)bounds;方法
        • 可以用来设置光标与占位的间距

          //控制placeHolder的位置,左右缩20
          -(CGRect)placeholderRectForBounds:(CGRect)bounds
          {
           
            //return CGRectInset(bounds, 20, 0);
            CGRect inset = CGRectMake(bounds.origin.x+50, bounds.origin.y, bounds.size.width -10, bounds.size.height);//更好理解些
            return inset;
          }
          扩充:系统还提供了很多类似的方法
          – textRectForBounds:  //重写来重置文字区域
          – drawTextInRect:    //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.
          – placeholderRectForBounds:  //重写来重置占位符区域
          – drawPlaceholderInRect:  //重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了
          – borderRectForBounds:  //重写来重置边缘区域
          – editingRectForBounds:  //重写来重置编辑区域
          – clearButtonRectForBounds:  //重写来重置clearButton位置,改变size可能导致button的图片失真
          – leftViewRectForBounds:
          – rightViewRectForBounds:

          原文链接:https://blog.csdn.net/u012907783/article/details/53157685

    对上述的代码,有任何疑问,可以在下方留言。 也可以给我发邮件咨询:673658917@qq.com 或者是直接加qq:673658917 转载请注明出处,谢谢合作。 睡觉舒服,那是给死人准备的,加油吧,一年后你会感谢现在的自己的。
  • 相关阅读:
    P2523 [HAOI2011]Problem c
    P2518 [HAOI2010]计数
    P2513 [HAOI2009]逆序对数列
    P2519 [HAOI2011]problem a
    P5020 货币系统
    P2580 于是他错误的点名开始了(Trie)
    P3805 【模板】manacher算法
    基础
    白兔的字符串(hash入门)
    ACM的分类训练题集(转载)
  • 原文地址:https://www.cnblogs.com/lishanshan/p/10107807.html
Copyright © 2020-2023  润新知