1、咱们一般在设计登陆界面时会用到UITextField,以下图所示:.net
一般想实现下面几点:设计
一、左边显示图片继承
二、textField中添加默认的占位符(提示文字),而且但愿占位符和左边图片有一点的距离,或者让占位符居中,图片
三、点击textField输入时光标的位置应该紧在占位符左侧,并紧挨着占位符get
最终实现效果以下图所示:it
2、左边显示图片很简单下面几行代码搞定(右边显示图片同理):io
UIImageView *passwordImage = [[UIImageView alloc] initWithImage:[UIImageimageNamed:@"passwordIcon"]];
password.leftView = passwordImage;class
password.leftViewMode = UITextFieldViewModeAlways;import
友情提示:上下两个图片的宽度要保持一致,否则会致使占位符的左边没法对其!登录
3、而设置占位符的位置和编辑状态时光标的位置试了不少方法感受都很差使,最终找到一个方法,自定义一个basicTextField继承自UITextField;而后能够重写下面的几个方法:
- (CGRect)borderRectForBounds:(CGRect)bounds;
- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)placeholderRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;
- (CGRect)clearButtonRectForBounds:(CGRect)bounds;
- (CGRect)leftViewRectForBounds:(CGRect)bounds;
- (CGRect)rightViewRectForBounds:(CGRect)bounds;
2、下面是具体的代码实现:
#import "basicTextField.h"
@implementation basicTextField
- (CGRect)leftViewRectForBounds:(CGRect)bounds{
CGRect iconRect = [super leftViewRectForBounds:bounds];
iconRect.origin.x += 10;
return iconRect;
}
// 重写占位符的x值
- (CGRect)placeholderRectForBounds:(CGRect)bounds{
CGRect placeholderRect = [super placeholderRectForBounds:bounds];
placeholderRect.origin.x += 1;
return placeholderRect;
}
// 重写文字输入时的X值
- (CGRect)editingRectForBounds:(CGRect)bounds{
CGRect editingRect = [super editingRectForBounds:bounds];
editingRect.origin.x += 20;
return editingRect;
}
// 重写文字显示时的X值
- (CGRect)textRectForBounds:(CGRect)bounds{
CGRect textRect = [super editingRectForBounds:bounds];
textRect.origin.x += 20;
return textRect;
}
4、这里有一个坑:就是当你同时重写这三个方法时,同时设置他们X的偏移量时会发现运行结果以下图。
// 重写占位符的X值
- (CGRect)placeholderRectForBounds:(CGRect)bounds{
CGRect placeholderRect = [super placeholderRectForBounds:bounds];
placeholderRect.origin.x += 80;
return placeholderRect;
}
看上图能够发现当点击textField使其处于输入状态时,光标和文字中间有间隔;这个间隔实际上是占位符的偏移量80,由于咱们设置了输入状态时光标的偏移量为20,占位符是80。而光标的偏移量是根据leftView的算的,占位符的偏移量是根据光标的位置算的。因此设置占位符偏移量为1是最合适的。至于其它的方法根据实际须要重写便可。