iOS实现输入框跟随键盘自动上移的实例代码

2020-01-18 22:27:34于海丽

场景还原

有些时候在包含输入框的页面中,点击输入框输入会因键盘弹起而遮挡住一部分输入框,影响用户体验。iOS在默认情况下并不会处理这种问题,不过我们可以自己实现键盘弹起输入框自动上移的效果。

ios,输入框跟随键盘,输入框随键盘移动,ios键盘上添加输入框

实现思路

观察键盘的弹起与收回,当弹起的键盘会遮挡住输入框时,将输入框跟随键盘一并上移合适的距离,当键盘收回时,输入框回到原始状态。

具体方案

1. 注册两个观察者,观察键盘的弹起与收回


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

2. 在上面的keyboardWillShow和keyboardWillHide方法中分别实现输入框的上移和还原

上移

当弹起的键盘遮住了页面上的输入框时,我们应该将输入框移至键盘之上,而键盘没有遮到输入框时,并不需要操作。因此在ios/225360.html">ios的坐标系下,我们可以分别获取键盘弹起后上端的Y坐标和输入框下端的Y坐标,通过做差可以判断出键盘是否遮住了输入框。上移我们可以采用view的transform属性进行平移变换,而不是直接去操作view的frame,这样做的好处是当我们要还原view的状态时可以直接将transform重置为0,而不需要再关心计算下移时的距离。

还原(下移至原始状态)

根据前面所说,我们只要在恰当的时机操作view的transform属性就可以实现了。


- (void)keyboardWillShow:(NSNotification *)notification
{
  //获取处于焦点中的view
  NSArray *textFields = @[phoneNemberText, verifyCodeText];
  UIView *focusView = nil;
  for (UITextField *view in textFields) {
    if ([view isFirstResponder]) {
      focusView = view;
      break;
    }
  }
  if (focusView) {
    //获取键盘弹出的时间
    double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    //获取键盘上端Y坐标
    CGFloat keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
    //获取输入框下端相对于window的Y坐标
    CGRect rect = [focusView convertRect:focusView.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
    CGPoint tmp = rect.origin;
    CGFloat inputBoxY = tmp.y + focusView.frame.size.height;
    //计算二者差值
    CGFloat ty = keyboardY - inputBoxY;
    NSLog(@"position keyboard: %f, inputbox: %f, ty: %f", keyboardY, inputBoxY, ty);
    //差值小于0,做平移变换
    [UIView animateWithDuration:duration animations:^{
      if (ty < 0) {
        self.view.transform = CGAffineTransformMakeTranslation(0, ty);
      }
    }];
  }
}

- (void)keyboardWillHide:(NSNotification *)notification
{
  //获取键盘弹出的时间
  double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  //还原
  [UIView animateWithDuration:duration animations:^{
    self.view.transform = CGAffineTransformMakeTranslation(0, 0);
  }];
}