>

改变设置文本框占位文字和图片,的文本框占位

- 编辑:澳门新葡亰平台游戏 -

改变设置文本框占位文字和图片,的文本框占位

事先有简友提出是或不是把品种中遇见的题目如故本事分享下,感觉提议也不错,我们看起来也是有系统,就先把教学项指标先放一放,代码照旧持续上传的,要是有看不懂的地点能够私信笔者

在UITextField中其默认的颜料是谈米白的占位文字,假设你要转移其占位文字的水彩能够透过以上项目来帮衬您轻轻便松解决

假定大家想实现这种效果与利益,点击相应的公文,占位文字呈现高亮 ,而其余文件框非高亮

落到实处效果与利益

.h文件
#import <UIKit/UIKit.h>

 图片 1

图片 2

@interface UITextField (CYXExtension)
/** 占位文字颜色 */
@property (strong, nonatomic) UIColor * placeholderColor;
@end

图片 3

点击文本框,光标和占位文字都会化为米黄,撤废编辑就能够卷土而来

.m文件

 

  • 光标变色只需求设置tintColor即可
  • 监听文本框是或不是编辑须求为文本框增加监听
  • 那儿供给获得文本框的占位label,能够经过runtime遍历当前类具备子类大概打断点的方法来赢得,这里运用便捷的断点方法图片 4能够窥见placeholderLabel有道是正是我们要求得到的占位label
#import "UITextField+CYXExtension.h"

static NSString * const CYXPlaceholderColorKey =         @"placeholderLabel.textColor";

@implementation UITextField (CYXExtension)
/**
 *  自定义占位文字颜色
 *
 *  @param placeholderColor 接收颜色
 */

- (void)setPlaceholderColor:(UIColor *)placeholderColor{

    if (placeholderColor == nil) {
    [self setValue:CYXGrayColor(255 * 0.65) forKeyPath:CYXPlaceholderColorKey];
}else{
    // 保存之前的占位文字
    NSString *placeholder = self.placeholder;

    // 保证placeholder被创建
    self.placeholder = @" ";
    [self setValue:placeholderColor forUndefinedKey:CYXPlaceholderColorKey];

    // 恢复之前的占位文字
    self.placeholder = placeholder;
  }

}

/**
 *  获得占位文字颜色
 */
- (UIColor *)placeholderColor{
    return [self valueForKeyPath:CYXPlaceholderColorKey];
}    

@end

对应代码

邀约使用啊

#import <UIKit/UIKit.h>

@interface XMGTextField : UITextField
/** 颜色 */
@property(nonatomic,strong)UIColor *placeholderColor;
@end



#import "XMGTextField.h"
#import <objc/runtime.h>
static NSString *const XMGPacerholderColorKeyPath=@"_placeholderLabel.textColor";


@implementation XMGTextField

//
//-(void)drawPlaceholderInRect:(CGRect)rect{
//    [self.placeholder drawInRect:CGRectMake(0, 10, rect.size.width, 25) withAttributes:@{NSForegroundColorAttributeName:[UIColor grayColor],
//                                                       NSFontAttributeName:self.font
//                                                       }];
//}

/**
 *  运行时(Runtime):
 苹果官方一台c语言库
 能做很多低层操作(比如访问隐藏的一些成员变量成员方法)
 */

-(void)awakeFromNib{
//  设置光标颜色和文字颜色一致
    self.tintColor=self.textColor;

//    不成第一响应者
    [self resignFirstResponder];

}
/**
 *  当前文本框失去焦点是就会调用
 */
-(BOOL)resignFirstResponder{
//    修改占位文字颜色
    [self setValue:[UIColor grayColor] forKeyPath:XMGPacerholderColorKeyPath];
    return [super resignFirstResponder];
}
/**
 *  当前文本框聚集焦点就会调用
 */
-(BOOL)becomeFirstResponder{
    [self setValue:self.textColor forKeyPath:XMGPacerholderColorKeyPath];
    return [super becomeFirstResponder];
}

-(void)setPlaceholderColor:(UIColor *)placeholderColor{
    _placeholderColor = placeholderColor;

//    修改占位文字颜色
    [self setValue:placeholderColor forKeyPath:XMGPacerholderColorKeyPath];
}

@end
- awakeFromNib{ self.tintColor = [UIColor whiteColor]; [self addTarget:self action:@selector(textEditBegin) forControlEvents:UIControlEventEditingDidBegin]; [self addTarget:self action:@selector(textEditEnd) forControlEvents:UIControlEventEditingDidEnd]; UILabel *label = [self valueForKey:@"placeholderLabel"]; label.textColor = [UIColor lightGrayColor]; self.label = label;}- textEditBegin{ self.label.textColor = [UIColor whiteColor];}- textEditEnd{ self.label.textColor = [UIColor lightGrayColor];}

 

如此就产生了以上效率,可是若是想将以此职能用在档案的次序的享有文本框中,就供给用到runtime

runtime方法

  • 创建四个UITextField的分类,并累加叁个placeholderColor品质,在分拣中增多属性不用接纳修饰符,系统会自动抬高
  • 因为OC控件基本都以懒加载,尽管在向来不安装占位文件前就设置了占位文字颜色,是不起功效的,那时候供给用到runtime为类保存属性
- 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));}
  • 单单保留属性也是相当不够的,在开创占位视图今后还亟需将品质赋值过去,这里就必要用runtime来交流方法落成
- bs_setPlaceholder:(NSString *)placeholder{ [self bs_setPlaceholder:placeholder]; self.placeholderColor = self.placeholderColor; }+ load{ Method setPlaceholder = class_getInstanceMethod(self, @selector(setPlaceholder:)); Method bs_setPlaceholder = class_getInstanceMethod(self, @selector(bs_setPlaceholder:)); method_exchangeImplementations(setPlaceholder, bs_setPlaceholder);}

注意,在bs_setPlaceholder情势中必得调用自身的set方法,因为交流方法之后,本身的set方法正是系统的set方法了,然后将系统的get方法赋值给协调,这里供给调用系统的set方法,就非凡调用了和谐的set方法

事先写的runtime文章

本文由java编程发布,转载请注明来源:改变设置文本框占位文字和图片,的文本框占位