在 UITextFields 之间切换

Switching between UITextFields

我有一个额外 UIView 的视图,它实际上是 2 UITextFields

的容器

当这些文本字段中的任何一个成为第一响应者时,我需要将它们向上移动,因为当键盘打开时,文本字段是不可见的。我正在处理 UIKeyboardDidShowNotificationUIKeyboardDidHideNotification 并使用如下文本字段更改容器视图的框架:

#pragma mark - 键盘通知处理

- (void) keyboardIsShown:(NSNotification *)notification {
    // Moving up text field while keyboard is opened

    CGRect containerFrame = self.viewContainerCredentials.frame;
    containerFrame.origin.y -= kCredentialsViewOffset;

    [UIView beginAnimations:@"moveUp" context:nil];
    [UIView setAnimationDuration:0.5f];
    self.viewContainerCredentials.frame = containerFrame;
    [UIView commitAnimations];
}

- (void) keyboardIsHidden:(NSNotification *)notification {
    // Moving down text field while keyboard is closed

    CGRect containerFrame = self.viewContainerCredentials.frame;
    containerFrame.origin.y += kCredentialsViewOffset;

    [UIView beginAnimations:@"moveDown" context:nil];
    [UIView setAnimationDuration:0.5f];
    self.viewContainerCredentials.frame = containerFrame;
    [UIView commitAnimations];
}

当我激活其中一个文本字段时 - 一切正常,当我关闭键盘时 - 视图容器也正确向下移动。

但是当我点击第一个字段并且视图容器向上移动然后我点击并激活第二个文本字段而不关闭键盘时 - 我的视图容器恢复其初始框架并返回到键盘下方。

有人可以帮忙吗?为什么会这样?

提前致谢。

更新:问题更深:视图容器的自动布局配置错误,在第一响应者每次辞职后都会被推回。

而不是手动执行此操作。使用 TPKeyboardAvoidingScrollView。它易于使用。

首先获取 UIScrollView 并将所有视图放入其中。

为了与 UITableViewController classes 一起使用,将 TPKeyboardAvoidingTableView.mTPKeyboardAvoidingTableView.h 放入您的项目中,并使您的 UITableView xib 中的一个 TPKeyboardAvoidingTableView。如果您的控制器没有使用 xib,我知道没有简单的方法可以使其 UITableView 成为自定义 class:阻力最小的途径是为它创建一个 xib。

对于 非 UITableViewControllers,将 TPKeyboardAvoidingScrollView.mTPKeyboardAvoidingScrollView.h 源文件放入您的项目中,将 UIScrollView 弹出到您的视图控制器的xib,将滚动视图的 class 设置为 TPKeyboardAvoidingScrollView,并将所有控件放在该滚动视图中。您也可以通过编程方式创建它,而无需使用 xib - 只需使用 TPKeyboardAvoidingScrollView 作为您的顶级视图。

建议您在项目中使用 TPKeyboardAvoiding as it handles all such issue related to keyboard with textfield. You can install it from cocoapods 并在整个应用程序中无缝使用它。

我们可以使用 UITextField 委托方法来制作这种动画。

这是我们在UITextfield成为FirstResponder时用动画移动view(y=218)的方法。

这里我在一个视图中放置了两个文本字段。当任何文本字段成为 FirstResponder 时,我将视图向上移动,即 y=100。当用户触摸屏幕上的任何位置或点击键盘上的 return 键时,将视图移动到其初始位置。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self moveViewUp];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
   [textField resignFirstResponder];
   [self moveViewDown];

   return YES;
}

-(void)moveViewUp
{
   __block CGRect rect=_vwForTextFields.frame;
   [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{

    if (rect.origin.y==218)
    {
        rect.origin.y=100;
        _vwForTextFields.frame=rect;

    }

   } completion:^(BOOL finished) {
    NSLog(@"View moved up");
   }];

}

-(void)moveViewDown
{
   __block CGRect rect=_vwForTextFields.frame;
   [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{

    if (rect.origin.y==100)
    {
        rect.origin.y=218;
        _vwForTextFields.frame=rect;

    }

   } completion:^(BOOL finished) {
    NSLog(@"View moved down");
   }];
}

//To dismiss keyboard when touched anywhere on screen
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   [self.view endEditing:YES];
   [self moveViewDown];

}

您好键盘通知方法 (keyboardIsShown) 将在键盘未显示时起作用,即当您单击弹出的文本字段键盘时第一次显示。当您切换到下一个文本字段时,键盘已经存在,因此不会第二次调用该方法。如果您希望使用当前实现移动文本字段,您可以为文本字段设置委托并在 viewcontroller

中实现此委托方法
//This will be called every time you click on the textfield. You can implement the method for moving the view up here   
    - (void)textFieldDidBeginEditing:(UITextField *)textField;


//Called when you have moved out of the textfield. You can implement when the keyboard is hiding.

    - (void)textFieldDidEndEditing:(UITextField *)textField; 

问题更严重 - 视图容器的自动布局配置错误,在将第一响应者设置为主视图上的任何其他控件后被系统推回。

我遇到了同样的问题,这个 post 救了我。在我阅读有关自动布局问题的更新后,我意识到我的问题正是这个,所以我将这一行添加到我的代码到 keyboardIsShown 方法的第一行,以禁用自动布局然后我激活它再次在 keyboardIsHidden.

In keyboardIsShown: view.TranslatesAutoresizingMaskIntoConstraints = true;

In keyboardIsHidden: view.TranslatesAutoresizingMaskIntoConstraints = false;