2015-07-13 77 views
1

之间切换我有额外的UIView一种观点认为其实是2 UITextFieldsUITextFields

容器当这些文字fiels的成为第一个响应者,我需要将它们移动,因为键盘打开时,文本字段不可见。我处理UIKeyboardDidShowNotificationUIKeyboardDidHideNotification和更改与文本字段这样的架式集装箱观点:

的#pragma马克 - 处理

- (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:问题更加严重:那里错误地配置了视图容器的自动布局,在第一响应者每次辞职后被推回。

+0

我猜因为视图容器的y原点已经在行中更改containerFrame.origin.y - = kCredentialsViewOffset;在keyboardIsShown方法中,如果没有隐藏键盘单击第二个文本字段,你确定它调用了keyboardIsShown方法吗? – Vani

+0

Vani,当点击第二个文本字段时,不会抛出键盘通知 - 在第一个文本字段上敲击后键盘已经打开。另外,正如你所看到的,我将动画视图容器向上移动到键盘上方,并且在点击secomd之后它会恢复到原来的状态 –

+0

http://macoscope.com/blog/working-with-keyboard-on-ios/这个链接将帮助你,并请通过这个链接,如果你的textfield的输入配件视图没有设置.http://stackoverflow.com/questions/22549911/why-is-uikeyboardwillshownotification-called-every-time-new-textfield-is -selecte – Vani

回答

0

问题是更深的 - 有被错划为View容器自动版式该在主视图上对第一响应者进行任何其他控制之后被系统推回。

0

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

首先采取的UIScrollView并把UR它里面的所有意见。

对于的UITableViewController类使用降TPKeyboardAvoidingTableView.mTPKeyboardAvoidingTableView .H到您的项目,并让您UITableView在厦门国际银行一个TPKeyboardAvoidingTableView。如果你没有在你的控制器上使用xib,我知道没有简单的方法使它的UITableView成为一个自定义类:阻力最小的路径是为它创建一个xib。

对于非UITableViewControllers,删除TPKeyboardAvoidingScrollView.mTPKeyboardAvoidingScrollView.h源文件到您的项目,弹出一个UIScrollView到您的视图控制器的XIB,滚动视图的类设置为TPKeyboardAvoidingScrollView,并把那个滚动视图中的所有控件。您也可以使用编程方式创建它,而不使用xib - 只需使用TPKeyboardAvoidingScrollView作为顶级视图。

+0

添加滚动视图或基于它的任何其他组件都可以工作,但我需要手动执行动画视图容器移动。 –

0

会建议你使用TPKeyboardAvoiding,因为它处理与键盘文本框所有这些问题。您可以将它从cocoapods安装到您的项目中,并无缝地在整个应用程序中使用它。

+0

谢谢阿曼!但我需要通过手动动画来完成 –

0

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

这是我们遵循与动画时的UITextField becomeFirstResponder移动视图(Y = 218)的方式。

我在这里将两个文本框在一个视图中。当任何文本字段成为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]; 

} 
+0

根据我的理解,在点击键盘上的返回按钮后,键盘将被解除? –

+0

是轻拍我辞职后键盘 – user4261201

+0

其实看起来不是最好的解决方案。当您退出第一响应者时,这意味着键盘将被解散,并在点击下一个输入之后 - 它将成为第一响应者,并且由于先前隐藏了键盘,它将再次显示 –

0

嗨键盘通知方法(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; 
+0

这是正确的,那就是重点 - 第一次调用keyboardIsSwwon时,视图容器被弹出。当我用打开的键盘点击第二个文本字段时 - 键盘通知没有被调用,并且它是正确的 - 我不需要在第二次点击后移动容器。但问题是,在这种情况下,键盘通知不会被调用,但视图会下移到初始位置 –

0

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

在keyboardIsShown:view.TranslatesAutoresizingMaskIntoConstraints = TRUE;

In keyboardIsHidden:view.TranslatesAutoresizingMaskIntoConstraints = false;