<转>对UITextField的键盘处理方法

http://blog.csdn.ofcdn.net/ch_soft/article/details/6948119

  1. - (void)registerForKeyboardNotifications  
  2. {  
  3.     //添加自己做为观察者,以获取键盘显示时的通知  
  4.     [[NSNotificationCenter defaultCenter] addObserver:self  
  5.                                              selector:@selector(keyboardWasShown:)  
  6.                                                  name:UIKeyboardDidShowNotification object:nil];  
  7.     //添加自己做为观察者,以获取键盘隐藏时的通知  
  8.     [[NSNotificationCenter defaultCenter] addObserver:self  
  9.                                              selector:@selector(keyboardWasHidden:)  
  10.                                                  name:UIKeyboardDidHideNotification object:nil];  
  11. }  
  12.   
  13. // 键盘出现时调用此方法  
  14. - (void)keyboardWasShown:(NSNotification*)aNotification  
  15. {  
  16.     //如果键盘是显示状态,不用做重复的操作  
  17.     if (keyboardShown)  
  18.         return;  
  19.       
  20.     //获得键盘通知的用户信息字典  
  21.     NSDictionary* info = [aNotification userInfo];  
  22.       
  23.     // 取得键盘尺寸.  
  24.     NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];  
  25.     CGSize keyboardSize = [aValue CGRectValue].size;  
  26.       
  27.     // 重新设置scrollView的size  
  28.     CGRect viewFrame = [myScrollView frame];  
  29.     viewFrame.size.height -keyboardSize.height;  
  30.     myScrollView.frame = viewFrame;  
  31.       
  32.       
  33.     // 把当前被挡住的text field滚动到view中适当的可见位置.  
  34.     CGRect textFieldRect = [activeField frame];  
  35.     [myScrollView scrollRectToVisible:textFieldRect animated:YES];  
  36.       
  37.       
  38.     //记录当前textField的偏移量,方便隐藏键盘时,恢复textField到原来位置  
  39.     oldContentOffsetValue = [myScrollView contentOffset].y;  
  40.       
  41.     //计算textField滚动到的适当位置  
  42.     CGFloat value = (activeField.frame.origin.y+myScrollView.frame.origin.y+activeField.frame.size.height - self.view.frame.size.height + keyboardSize.height)+2.0f;  
  43.       
  44.     //value>0则表示需要滚动,小于0表示当前textField没有被挡住,不需要滚动  
  45.     if (value > 0) {  
  46.         //使textField滚动到适当位置  
  47.         [myScrollView setContentOffset:CGPointMake(0, value) animated:YES];  
  48.         isNeedSetOffset = YES;//更改状态标志为需要滚动  
  49.     }  
  50.   
  51.     //更改键盘状态标志为已显示  
  52.     keyboardShown = YES;  
  53. }  
  54.   
  55.   
  56. // 键盘隐藏时调用此方法  
  57. - (void)keyboardWasHidden:(NSNotification*)aNotification  
  58. {  
  59.   
  60.       
  61.     NSDictionary* info = [aNotification userInfo];  
  62.       
  63.     // Get the size of the keyboard.  
  64.     NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];  
  65.     CGSize keyboardSize = [aValue CGRectValue].size;  
  66.       
  67.     // Reset the height of the scroll view to its original value  
  68.     CGRect viewFrame = [myScrollView frame];  
  69.     viewFrame.size.height += keyboardSize.height;  
  70.     myScrollView.frame = viewFrame;  
  71.       
  72.     //如果状态标志为需要滚动,则要执行textFiled复位操作  
  73.     if (isNeedSetOffset) {  
  74.         //oldContentOffsetValue记录了textField原来的位置,复位即可  
  75.         [myScrollView setContentOffset:CGPointMake(0, oldContentOffsetValue) animated:YES];  
  76.     }  
  77.   
  78.     //复位状态标志  
  79.     isNeedSetOffset = NO;  
  80.     keyboardShown = NO;  
  81. }  
posted @ 2012-09-21 19:19  不曾拥有  阅读(240)  评论(0编辑  收藏  举报