UITextField 关于placeholder属性的用法

关于UITextField设置占位文字,最常用的就是直接赋值,如下:

textField.placeholder = @"请输入用户名";

但是,在我们的开发中,会遇到各种各样的需求,这就需要我们了解placeholder这个属性更多的作用,下面我列举了一些:例如修改占位文字和光标的颜色,大小等…

一、设置占位文字的颜色

方法一 : 利用富文本

/** 手机号输入框 */
@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设置属性

// 设置占位文字的颜色为红色
[textField 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]];
}

二、设置光标颜色

// 设置光标的颜色
textField.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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值