- - (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;
- }
对UITextField的键盘处理方法
最新推荐文章于 2021-01-17 13:32:22 发布