【iOS开发】自定义UITextField

一、 UITextField的基本使用

  1. 设置光标颜色
// 设置光标颜色
self.tintColor=[UIColor whiteColor];
  1. 设置输入文字颜色
// 设置输入文字颜色
self.textColor=[UIColor whiteColor];
  1. 通过代理设置开始输入和结束输入时占位文字的颜色
    一般情况下最好不要UITextView自己成为代理或者监听者
// 开始编辑
[self addTarget:self action:@selector(textDidBeginEdit)forControlEvents:UIControlEventEditingDidBegin];
// 结束编辑
[self addTarget:self action:@selector(textDidEndEdit)forControlEvents:UIControlEventEditingDidEnd];

二、UITextField占位文字颜色修改

1、通过设置attributedPlaceholder属性修改

- (void)setPlaceholderColor:(UIColor*)color {
      NSMutableDictionary *attrDict = [NSMutableDictionary dictionary];
      attrDict[NSForegroundColorAttributeName] = color;
      NSAttributedString *attr=  [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrDict];
      self.attributedPlaceholder = attr;
}

2、通过KVC拿到UITextView的占位label就可修改颜色

- (void)setPlaceholderLabelColor:(UIColor *)color {
      UILabel*placeholderLabel = [self valueForKeyPath:@"placeholderLabel"];
      placeholderLabel.textColo r= color;
}

3、通过Runtime来设置UITextView占位文字颜色
给UITextField添加一个占位文字颜色属性,而给系统类添加属性,就必须使用runtime来实现, 分类只能生成属性名
自定义setPlaceholder:并与系统setPlaceholder:方法交换

  • 交换系统setPlaceholder:设置占位文字和自定义my_setPlaceholder:方法
  • 交换原因:如果外界使用先设置了占位颜色,再设置占位文字,设置颜色时没有文字设置不成功
  • 交换设置占位文字方法,外界调用系统方法设置占位文字时,会自动调用自定义的设置占位文字方法,再调用系统设置占位文字方法,在自定义设置占位文字方法中自动设置占位文字颜色

具体实现
1> 给UITextView添加一个分类, 声明一个placeholderColor属性

// .h文件

#import 

@interface UITextField (Placeholder)

@property UIColor *placeholderColor;

@end

2>.实现placeholderColor属性的setter和getter方法

// .m文件

#import "UITextField+Placeholder.h"

#import 

NSString * const placeholderColorName = @"placeholderColor";

@implementation UITextField (Placeholder)

+ (void)load {

    // 获取setPlaceholder
    Method  setPlaceholder = class_getInstanceMethod(self, @selector(setPlaceholder:));
    // 获取ld_setPlaceholder
    Method  ld_setPlaceholder = class_getInstanceMethod(self, @selector(ld_setPlaceholder:));

    // 交换方法
    method_exchangeImplementations(setPlaceholder, ld_setPlaceholder);
}

// OC最喜欢懒加载,用的的时候才会去加载
// 需要给系统UITextField添加属性,只能使用runtime
- (void)setPlaceholderColor:(UIColor *)placeholderColor {

    // 设置关联
    objc_setAssociatedObject(self,(__bridge const void *)(placeholderColorName), placeholderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    // 设置占位文字颜色
    UILabel *placeholderLabel = [self valueForKeyPath:@"placeholderLabel"];

    placeholderLabel.textColor = placeholderColor;
}

- (UIColor *)placeholderColor {

    // 返回关联
    return objc_getAssociatedObject(self, (__bridge const void *)(placeholderColorName));
}

// 设置占位文字,并且设置占位文字颜色
- (void)ld_setPlaceholder:(NSString *)placeholder {

    // 1.设置占位文字
    [self ld_setPlaceholder:placeholder];

    // 2.设置占位文字颜色
    self.placeholderColor = self.placeholderColor;
}

@end

你可能感兴趣的:(【iOS开发】自定义UITextField)