在UITextField之间切换

时间:2015-07-13 11:03:36

标签: ios objective-c uitextfield uikeyboard uianimation

我有一个附加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];
}

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

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

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

提前谢谢。

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

6 个答案:

答案 0 :(得分:0)

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

首先使用UIScrollView并将所有视图放在其中。

要与 UITableViewController 类一起使用,请将TPKeyboardAvoidingTableView.mTPKeyboardAvoidingTableView。h放入您的项目中,并使UITableView成为TPKeyboardAvoidingTableView厦门国际银行。如果你没有在控制器中使用xib,我知道没有简单的方法可以使UITableView成为自定义类:阻力最小的路径就是为它创建一个xib。

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

答案 1 :(得分:0)

建议您使用TPKeyboardAvoiding,因为它会处理与带有文本字段的键盘相关的所有问题。您可以在项目中从cocoapods安装它,并在整个应用程序中无缝使用它。

答案 2 :(得分:0)

我们可以使用UITextField Delegate方法进行这种动画。

当UITextfield成为FirstResponder时,这是我们用动画移动视图(y = 218)的方式。

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

- (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];

}

答案 3 :(得分:0)

Hi键盘通知方法(keyboardIsShown)将在键盘弹出时单击文本字段键盘时首次显示时工作。当您切换到下一个文本字段时,键盘已经存在,因此第二次不调用该方法。如果您希望使用当前实现移动文本字段,则可以设置textfield的委托并在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; 

答案 4 :(得分:0)

问题更严重 - 错误地为视图容器配置了自动布局,在第一响应者对主视图进行任何其他控制后,系统将其推回。

答案 5 :(得分:0)

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

  

在keyboardIsShown中: view.TranslatesAutoresizingMaskIntoConstraints = true;

     

在keyboardIsHidden中: view.TranslatesAutoresizingMaskIntoConstraints = false;