<转>对UITextField的键盘处理方法
2012-09-21 19:19
330 查看
http://blog.csdn.ofcdn.net/ch_soft/article/details/6948119
- (void)registerForKeyboardNotifications
{
//添加自己做为观察者,以获取键盘显示时的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
//添加自己做为观察者,以获取键盘隐藏时的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasHidden:)
name:UIKeyboardDidHideNotification object:nil];
}
// 键盘出现时调用此方法
- (void)keyboardWasShown:(NSNotification*)aNotification
{
//如果键盘是显示状态,不用做重复的操作
if (keyboardShown)
return;
//获得键盘通知的用户信息字典
NSDictionary* info = [aNotification userInfo];
// 取得键盘尺寸.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// 重新设置scrollView的size
CGRect viewFrame = [myScrollView frame];
viewFrame.size.height -= keyboardSize.height;
myScrollView.frame = viewFrame;
// 把当前被挡住的text field滚动到view中适当的可见位置.
CGRect textFieldRect = [activeField frame];
[myScrollView scrollRectToVisible:textFieldRect animated:YES];
//记录当前textField的偏移量,方便隐藏键盘时,恢复textField到原来位置
oldContentOffsetValue = [myScrollView contentOffset].y;
//计算textField滚动到的适当位置
CGFloat value = (activeField.frame.origin.y+myScrollView.frame.origin.y+activeField.frame.size.height - self.view.frame.size.height + keyboardSize.height)+2.0f;
//value>0则表示需要滚动,小于0表示当前textField没有被挡住,不需要滚动
if (value > 0) {
//使textField滚动到适当位置
[myScrollView setContentOffset:CGPointMake(0, value) animated:YES];
isNeedSetOffset = YES;//更改状态标志为需要滚动
}
//更改键盘状态标志为已显示
keyboardShown = YES;
}
// 键盘隐藏时调用此方法
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
// Get the size of the keyboard.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// Reset the height of the scroll view to its original value
CGRect viewFrame = [myScrollView frame];
viewFrame.size.height += keyboardSize.height;
myScrollView.frame = viewFrame;
//如果状态标志为需要滚动,则要执行textFiled复位操作
if (isNeedSetOffset) {
//oldContentOffsetValue记录了textField原来的位置,复位即可
[myScrollView setContentOffset:CGPointMake(0, oldContentOffsetValue) animated:YES];
}
//复位状态标志
isNeedSetOffset = NO;
keyboardShown = NO;
}
- (void)registerForKeyboardNotifications
{
//添加自己做为观察者,以获取键盘显示时的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
//添加自己做为观察者,以获取键盘隐藏时的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasHidden:)
name:UIKeyboardDidHideNotification object:nil];
}
// 键盘出现时调用此方法
- (void)keyboardWasShown:(NSNotification*)aNotification
{
//如果键盘是显示状态,不用做重复的操作
if (keyboardShown)
return;
//获得键盘通知的用户信息字典
NSDictionary* info = [aNotification userInfo];
// 取得键盘尺寸.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// 重新设置scrollView的size
CGRect viewFrame = [myScrollView frame];
viewFrame.size.height -= keyboardSize.height;
myScrollView.frame = viewFrame;
// 把当前被挡住的text field滚动到view中适当的可见位置.
CGRect textFieldRect = [activeField frame];
[myScrollView scrollRectToVisible:textFieldRect animated:YES];
//记录当前textField的偏移量,方便隐藏键盘时,恢复textField到原来位置
oldContentOffsetValue = [myScrollView contentOffset].y;
//计算textField滚动到的适当位置
CGFloat value = (activeField.frame.origin.y+myScrollView.frame.origin.y+activeField.frame.size.height - self.view.frame.size.height + keyboardSize.height)+2.0f;
//value>0则表示需要滚动,小于0表示当前textField没有被挡住,不需要滚动
if (value > 0) {
//使textField滚动到适当位置
[myScrollView setContentOffset:CGPointMake(0, value) animated:YES];
isNeedSetOffset = YES;//更改状态标志为需要滚动
}
//更改键盘状态标志为已显示
keyboardShown = YES;
}
// 键盘隐藏时调用此方法
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
// Get the size of the keyboard.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// Reset the height of the scroll view to its original value
CGRect viewFrame = [myScrollView frame];
viewFrame.size.height += keyboardSize.height;
myScrollView.frame = viewFrame;
//如果状态标志为需要滚动,则要执行textFiled复位操作
if (isNeedSetOffset) {
//oldContentOffsetValue记录了textField原来的位置,复位即可
[myScrollView setContentOffset:CGPointMake(0, oldContentOffsetValue) animated:YES];
}
//复位状态标志
isNeedSetOffset = NO;
keyboardShown = NO;
}
相关文章推荐
- EasyUI的datagrid中<a>标签需要点两次才能触发事件的处理方法
- JAVA List<Map>结果集处理方法集合
- iOS 控件之UITextField及键盘挡住处理方法(欢迎大家提建议和分享)
- php <a href></a>链接地址中是php变量,链接文本也是php变量的代码处理方法
- 大数据的处理方法<一>
- iOS 处理缓存的三种方法<6度XZ>
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 在IE8,FF中<select>控件文字垂直居中的处理方法
- JS 使用List<Object> 对象中的Object对象的某个属性的临时处理方法
- iOS 网络请求 时 出现 <null> 与 (null) 的 问题的处理方法
- 对UITextField的键盘处理方法
- 使用<a>标签调用struts2的action、传递动态参数、以及参数中出现加号等特殊字符的处理方法
- IOS 键盘协议之一 <UITextFieldDelegate>
- MyBatis 3在XML文件中处理大于号小于号(<>)的方法(转)
- 大数据处理之道(实验方法<二>)
- textField 限制文本框输入个数 自动切换下一行 <UITextFieldDelegate>代理方法
- Java 处理Map<K,V>的方法
- <转载>在C#中利用Keep-Alive处理Socket网络异常断开的方法
- 大数据处理之道(实验方法<二>)
- 无法在此路径使用此配置节。当站点管理员使用继承的配置文件中的 <location allowOverride="false"> 错误处理方法!