UITextField控件的诸多特性都和UITextView相似,比如成为输入文本焦点时键盘自动显示,支持长按弹出动作选项,能够接收输入事件(开始输入,修改内容,结束输入和点击回车等)。

1.特有的特

但对于UITextField来说,他又有很多自己独有的特性:

(1)placeholder.

当UITextField上没有文本内容时,会以灰色的内容显示placeholder的内容,并且一点有正式的文本内容输入并呈现,placeholder内容会隐藏

self.textField.placeholder = @"Please input you userName";

(2)一次性删除所有内容

如果开发者设置了这个属性,当它起作用时,会靠近UITextField控件后端显示一个“x”按钮,当用户点击此按钮时,所有之前的UITextField上输入的内容都会被删除。

IOS提供了针对这个“X”按钮的四种显示时机,分别是永不显示,当输入时显示,当输入时不显示,一直显示,如果用代码的话,则是对clearButtonMode的属性设置为下列系统常量之一。

typedef NS_ENUM(NSInteger, UITextFieldViewMode)
{
UITextFieldViewModeNever,
UITextFieldViewModeWhileEditing,
UITextFieldViewModeUnlessEditing,
UITextFieldViewModeAlways
};

设置代码如下:

self.textField.clearButtonMode=UITextFieldViewModeAlways;

(3)输入内容的清空时机

默认的UITextField的内容如果不点击清空按钮或者键盘的回退按钮,并不会无故被清掉。但是如果UITextField的内容是保密特性时,这个默认的清空内容机制变成了每次开始输入新内容时,上一次的内容自动清空。

而UITextField还提供了另一种清空机制,当每次焦点移动到UITextField上弹出键盘时,上一次内容自动清空(默认需要输入才会清空),这个设置实现代码如下:

self.textField.clearsOnBeginEditing = YES;

(4)四种UITextField边框式样供挑选

四种边框式样分别是无边框,黑线边框,贝泽尔带阴影边框,圆角边框。并且当式样非圆角边框时,开发者可以自定义UITextField的背景图片,考虑到UITextField的细长性和可拉伸性,所提供的图片也要是可拉伸的。

3.可拉伸图片

所谓可拉伸的图片,是指提供的图片无论横向还是纵向都不用提供全部像素,当某个情况下图片所要放置的地方的横向或纵向数值比图片本身大时,此图片有能力以自己横向某一行或纵向某一列像素点为依据进行自我拉伸。其实这个所谓的拉伸,就是系统对某些由开发者指定的像素进行简单复制而已。

IOS6以后的拉伸方法如下:

self.textField.background=[[UIImage imageNamed:@"back.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 8.0f, 0.0f, 8.0f)];

其中使用到的是Inset即内缩进的概念,内缩进的生成方法:

UIEdgeINsets UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right);

这里UIEdgeInsetsMake的意思就是我们从左边数起8个像素,右边数起8个像数,这样剩余中间像素自然就成了系统的横向拉伸点。开发者当然也可以将这个数字8理解成左边数起多少个像素保持不变,右边数起多少个像素保持不变,原理是一样的。

4.避免被键盘挡住

和UITextView不同,UITextField由于高度只有固定的30px.并且不像UITextView可以对内容进行滚动。所以再输入时,如果从屏幕底下弹出的键盘将UITextField控件不幸给遮盖住了的话,将非常影响用户体验,甚至造成无法继续程序工作流程的漏洞。

所以如果项目中有类似处于屏幕较低位置UITextField控件存在的情况发生时,开发者需要考虑将UITextField动态地向上移动到用户能够看到全貌的地方。

我们来做个简单地例子:

如图所示:

当然,如果我们使用UIScrollView作为控件的载体会更方便,不过这里我们关心的是做法,目的和实现原理是差不多的。所以我们使用普通的UIView类 的对象contentView即可。

随后将“用户名”UITextField控件的键盘回车键设置成“Next”的式样,以期望点击后将焦点移到“密码”UITextField对象,而“密码”UITextField的n返回键可以设置成“Done”式样,以期望点击后收起键盘。

首先设置属性:

 @property (weak, nonatomic) IBOutlet UITextField *txtUserName;
@property (weak, nonatomic) IBOutlet UITextField *txtPassword;
@property (strong, nonatomic) IBOutlet UIView *contentView;

随后为程序增加两个对于键盘显示和隐藏的系统消息监视,这样当键盘显示和隐藏时,系统能够回调到相应的处理函数

- (void)viewDidLoad
{
[super viewDidLoad];
self.txtUserName.delegate=self;
self.txtPassword.delegate=self; // Do any additional setup after loading the view, typically from a nib.
//键盘显示消息的回调函数
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:) name:UIKeyboardWillShowNotification object:nil]; //键盘隐藏消息的回调函数
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHidden:) name:UIKeyboardWillHideNotification object:nil];
}

之后就是对显示键盘的回调函数keyboardDidShown的撰写,具体代码如下:

#pragma mark-
#pragma mark Keyboard Notification
-(void)keyboardWillShown:(NSNotification *)aNotification
{
//设置键盘显示的flag
_keyboardShowing=YES; //收取消息内容并获得键盘大小
NSDictionary *info=[aNotification userInfo];
NSValue *aValue=[info objectForKey:UIKeyboardFrameEndUserInfoKey]; //当设备横屏时,直接取键盘的大小并不准确
//因为系统为键盘的视图增加了一个stransform的内容
//所以这里有必要进行一次坐标转换,以保证键盘大小在特定设备方向上的准确
CGSize keyboardSize = [self.view convertRect:[aValue CGRectValue] fromView:nil].size; //将键盘大小记录下来
_sizeKeyboard=CGSizeMake(keyboardSize.width, keyboardSize.height); //因为要计算UITextField是不是被键盘隐藏了,而键盘时显示在UIWindow上的
//所以UITextField的坐标也要转换到self.view上,再同一层面上的坐标比较这样才有意义
CGRect retTextField=[[_activeTextField superview]convertRect:_activeTextField.frame toView:self.view]; //进行移动
[self moveContentView:self.contentView keyboardSize:_sizeKeyboard textFieldRectOnMainView:retTextField];
} #pragma mark -
#pragma mark Utility
-(void)moveContentView:(UIView *)aView keyboardSize:(CGSize)sizeKeyboard textFieldRectOnMainView:(CGRect)rectTextField
{
//UITextField当前是否完全显示出来
if(CGRectContainsRect(CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame)-sizeKeyboard.height), rectTextField))
{
//不需要移动
return;
} //计算需要移动的距离
//之所以不适用self.view.frame,因为self.view作为程序的根视图
//所以大小一直是竖屏的大小,横屏时系统只对根视图的transform进行配置,高度不变
//既然contentView高度不变,只变Y轴起始点,那不如直接取contentView的高度
float fDelta=sizeKeyboard.height-CGRectGetHeight(aView.frame)+CGRectGetMinY(rectTextField)+CGRectGetHeight(rectTextField); //移动
[UIView animateWithDuration:0.3f animations:^{
aView.frame=CGRectMake(CGRectGetMinX(aView.frame), CGRectGetMinY(aView.frame)-fDelta, CGRectGetWidth(aView.frame), CGRectGetHeight(aView.frame));
}completion:^(BOOL finished) { }];
}

由于有两个UITextField对象,所以_activeTextField的成员量是记录了当前焦点中的UITextField对象。剩下的键盘隐藏消息处理函数keyboardWillHidder代码如下:

-(void)keyboardWillHidden:(NSNotification *)aNotification
{
//没有焦点中的UITextField了
_activeTextField=nil; //设置键盘未显示的flag
_keyboardShowing=NO; //将contentView的坐标移动回(0.0,0.0)点
[UIView animateWithDuration:0.3f animations:^{
self.contentView.frame=CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.contentView.frame), CGRectGetHeight(self.contentView.frame));
}completion:^(BOOL finished) { }];
}

最后我们需要考虑到UITextField两个对象之间的焦点转移问题和键盘的隐藏问题

#pragma mark-
#pragma mark UITextField Delegate
//焦点进入UITextField后,可以开始输入的回调函数
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
//当前焦点的UITextField
_activeTextField=textField; //如果没有显示键盘,哪移动的任务交给keyboardWillShown:来做,这里return
//否则的话,移动的任务在这里完成
if(!_keyboardShowing)
{
return;
} //显然,能够走到这里,是因为Next的关系
//我们要和keyboardWillShown里面写的一样,将有效的UITextField位置取出来
//检查是否需要移位
CGRect rectTextField=[[_activeTextField superview]convertRect:_activeTextField.frame toView:self.view]; //contentView的移动必须性检查和执行移动
[self moveContentView:self.contentView keyboardSize:_sizeKeyboard textFieldRectOnMainView:rectTextField];
} //点击UITextField对应的键盘的回车键的回调函数
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//按了“Next”
if(textField == self.txtUserName)
{
[self.txtPassword becomeFirstResponder];
return YES;
} //按了“Done”
if(textField == self.txtPassword)
{
[self.view endEditing:YES];
return YES;
}
return YES;
}

IOS 学习笔记(6) 控件 文本域(UITextField)的使用方法的更多相关文章

  1. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  2. iOS学习笔记——基础控件(上)

    本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...

  3. ios 学习笔记之控件属性

    1.文本框 设置密码属性:Secure Text Entry 勾选; 设置文本框带清除属性: Clear Button =Is always visible;  默认是不带清除属性:Never app ...

  4. IOS 学习笔记(4) 控件 标签(UILabel)的使用方法

    虽说Label的中文翻译是标签标记,但它其实是一个静态文本内容的展现控件. 一般来说,UILabel只是一个只读的文本视图,开发者可以利用UiLabel来展示内容长度有固定上限的文字内容.并且,UIL ...

  5. IOS 学习笔记(7) 控件 分隔栏控件(UISegmentControl)的使用方法

    分隔栏控件的系统默认式样一共有3种,分别是“普通式样”,"边框式样","条状式样" 分隔栏控件中有一个momentary属性,默认时NO.当开发者配置成YES时 ...

  6. ios 学习笔记(8) 控件 按钮(UIButton)的使用方法

    在实际开发中,对于开发者来说,更多的还是使用“自定义”按钮.将“按钮”对象的类型设置成UIButtonTypeCustom.这样一来,按钮的所有元素都将由开发者来配置和自定义. 对于一个自定义按钮来说 ...

  7. iOS学习之UIPickerView控件的关联选择

    接上篇iOS学习之UIPickerView控件的简单使用 接着上篇的代码 http://download.csdn.net/detail/totogo2010/4391870 ,我们要实现的效果如下: ...

  8. IOS开发学习笔记018- 一般控件的使用

    1.移动 2.动画 3.缩放 3.旋转 4.简化代码 5.总结 UIButton 的两种状态 normal highlighted  1.移动 OC语法规定:不允许直接修改某个对象中结构体属性的成员. ...

  9. Python:GUI之tkinter学习笔记1控件的介绍及使用

    相关内容: tkinter的使用 1.模块的导入 2.使用 3.控件介绍 Tk Button Label Frame Toplevel Menu Menubutton Canvas Entry Mes ...

随机推荐

  1. win7环境下安装MongoDB

    1.从http://www.mongodb.org/downloads获取,下载适合windows版本的mongodb,注意32位和64位的区别2.将下载的zip版本,解压到D:/mongodb3.创 ...

  2. 从VS转MyEclipse的15天使用体验

    脱离了VS强大的IDE功能之后,转向MyEclipse,发现很大差别,Java的IDE对比VS感觉弱很多,而且树形没有那么好用,Java里面是以包为主,区别与C#的最大就是,高亮提示关键字,这一点Ja ...

  3. oracle数据库获取指定表的列的相关信息

    1.很多时候我们需要从数据库中获取指定表的所有列的相关属性,如 name,commens,datatype,datalength,pk等.下面就是制定的语句. select c.TABLE_NAME ...

  4. Linux前台的程序转到后台执行(关闭终端而不杀死命令)

    你是否经常遇到这样的情况,通过SSH或者终端putty连接到一台linux/unix机器,执行一个程序.一个脚本或者一条命令,但现在你需要关闭SSH或者终端,由于该该程序.脚本或者命令正在运行,一旦你 ...

  5. Java I/O流操作(二)---缓冲流[转]

    转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的 ...

  6. 用例图(UseCase Diagram)—UML图(一)

      从上面的用例图模型,我们可以大致了解用例图所描述的是什么.下面进行详细介绍. 用例图,即用来描述什么角色通过某某系统能做什么事情的图,用例图关注的是系统的外在表现,系统与人的交互,系统与其它系统的 ...

  7. vsvim _vsvimrc 设置(转)

    c_joewang的专栏 (转) vsvim安装到vs2010后可以使用绝大部分原生vim的编辑功能,包括宏录制,也可以通过配置设置键盘映射,关于支持的编辑功能等可以参考上面链接去查看相关文档. Vi ...

  8. 查看SQLServer数据库信息的SQL语句

    --查看数据库中的表信息, --包括(表名,记录数,保留空间,使用空间,索引使用空间,未用空间) exec sp_MSForEachTable @precommand=N'create table # ...

  9. textarea中的空格与换行

    当在一个textarea标签中键入一个回车时,实际上会插入2个符号:\n\r在javascript里, line breaks用\n表示when you pull text into Javascri ...

  10. PHP开发APP接口

    第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...