我有一个额外的UIView
的视图,实际上是2个UITextFields
的容器
当任何这些文本字段成为第一响应者时,我需要将它们向上移动,因为当键盘打开时,文本字段不可见。我正在处理UIKeyboardDidShowNotification
和UIKeyboardDidHideNotification
,并使用如下文本字段更改容器视图框架:
#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:问题更深:错误地配置了视图容器的自动布局,在每次第一响定者辞职后被推迟。
不需要手动操作。使用TPKeyboardAvoidingScrollView。它很容易使用。
首先取UIScrollView并将所有视图放入其中。
对于UITableViewController类的使用,将TPKeyboardAvoidingTableView.m
和TPKeyboardAvoidingTableView
.h放入您的项目中,并使您的UITableView
在xib中成为TPKeyboardAvoidingTableView
。如果您没有将xib与控制器一起使用,我知道没有简单的方法可以使其UITableView
成为自定义类:阻力最小的路径是为它创建xib。
对于非uitableviewcontrollers ,将TPKeyboardAvoidingScrollView.m
和TPKeyboardAvoidingScrollView.h
源文件放入项目中,将UIScrollView
弹出到视图控制器的xib中,将滚动视图的类设置为TPKeyboardAvoidingScrollView
,并将所有控件放入该滚动视图中。您也可以通过编程方式创建它,而不使用xib -只需使用TPKeyboardAvoidingScrollView
作为您的顶层视图。
建议您使用tpkeyboardavoidance,因为它处理所有与键盘文本字段相关的问题。你可以将它从cocoapods安装到你的项目中,并在整个应用中无缝地使用它。
我们可以使用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];
}
键盘通知方法(keyboardisshowed)将在键盘未显示时工作,即当您单击文本框键盘弹出时。当你切换到下一个文本域时,键盘已经存在了,所以这个方法不会在第二次被调用。如果你想用当前实现移动文本框你可以为文本框设置委托并在视图控制器中实现这个委托方法
//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;
问题更严重-在主视图上创建第一响应者任何其他控件后,系统错误地配置了视图容器的自动布局。
我也有同样的问题,这篇文章救了我。在我阅读了关于自动布局问题的更新后,我意识到我的问题正是如此,所以我将这行添加到我的代码到keyboardIsShown
方法的第一行,以便禁用自动布局,然后我在keyboardIsHidden
中再次激活它。
在keyboardisshowed: 视图中。TranslatesAutoresizingMaskIntoConstraints = true;
在keyboardIsHidden: 视图中。TranslatesAutoresizingMaskIntoConstraints = false;