iOS视图在键盘消失后自动向下移动
我有一个iPad项目,在其视图控制器的内部,在面板视图内有两个TextField(在Storyboard中构建视图)。我想要实现的是,当任何文本字段成为第一响应者(即键盘出现)时,面板视图将向上移动,如果键盘消失,它将向下移动到原点位置。iOS视图在键盘消失后自动向下移动
一旦我测试向上移动,我发现视图会在键盘消失后自动回到原点位置,但我没有写任何代码来做这件事。
代码拉升:
- (void)moveUpTextFields {
if ([self.emailTextField isFirstResponder] || [self.passwordTextField isFirstResponder]) {
CGRect frame = self.textFieldPanel.frame;
frame.origin.y -= 50;
self.textFieldPanel.frame = frame;
}
}
所以我想弄清楚如何发生的呢,我应该如何实现我的目标(即,如果键盘出现,并回到原来的位置上移)?
更新:
为了达到我的目标,它应该使用键盘通知。在viewWillAppear
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
我在另一个项目很久以前这样做注册这些通知,只是没有摆在首位:(
OK,这样怪异的行为是因为当键盘出现或消失,它会重新布局视图控制器的子观点,引发-(void)viewDidLayoutSubviews
和重新定位回到StoryBoard的位置。如果视图是由代码创建的,那么这不会成为问题。
除了为KeyBoard添加通知外,我们还需要在viewDidLayoutSubviews中重新定位视图,因为在布局子视图之前触发了通知。
- (void)keyboardWillShow:(NSNotification *)notification {
CGSize keyboardSize = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat y = self.view.frame.size.height - keyboardSize.height - self.textFieldPanel.frame.size.height - 5;
CGRect frame = self.textFieldPanel.frame;
panelViewYOffset = frame.origin.y - y;
frame.origin.y -= panelViewYOffset;
// Since it will layout subviews in viewDidLayout, why we set frame here?
// I tried to move this line, turns out the panel will move up but the animation is gone
// So this line will have a nice liner animation curve but I don't why, may be someone can explain it.
self.textFieldPanel.frame = frame;
}
- (void)keyboardWillHide:(NSNotification *)notification {
CGRect frame = self.textFieldPanel.frame;
frame.origin.y += panelViewYOffset;
self.textFieldPanel.frame = frame;
panelViewYOffset = 0;
}
在viewDidLayoutSubviews:
- (void)viewDidLayoutSubviews {
CGRect frame = self.textFieldPanel.frame;
frame.origin.y -= panelViewYOffset;
self.textFieldPanel.frame = frame;
}
正如我所提到的,这种方法只适用于从故事板中(界面生成器)视图中,如果self.textFieldPanel
由代码创建的,那么在viewDidLayoutSubviews代码应被删除。
记得你必须听在通知中心中的键盘事件,幸运的是,这是几乎所有应用程序需要的功能,因此请检查此:) https://github.com/aceontech/KBKeyboardHandler
它完全符合您的需求,但我更喜欢如果您了解它的行为方式(注册系统通知)。
它也可以通过的CocoaPods如果你想
荚“KBKeyboardHandler”
哦,谢谢,我忘了一年前在另一个项目中做过的听众。你知道它为什么会自动下移吗? – SnowWolf
我不明白你的意思是自动下移,所以只需注册我给你的处理程序并实现委托方法:),当键盘出现或消失时它会通知你,因此你可以将视图向上或向下移动 –
上下移动就像我说过的,很久以前我在另一个项目中做的事情就是不记得马上。这篇文章中的主要问题是弄清楚一些意想不到的行为,我假设文本字段。情况是我编写代码在键盘显示后移动视图。但是当我关闭键盘时,视图自动回到原始位置。由于没有代码可以移动视图,所以在我移动之后它应该保持这个位置。 – SnowWolf