我有一个iPad项目,在其中一个视图控制器中,面板视图中有两个TextField(视图在Storyboard中构建)。我想要实现的是当这些文本域中的任何一个成为第一响应者(即键盘出现)时,面板视图将向上移动,如果键盘消失,它将向下移动到原点位置。
一旦我测试向上移动,我发现键盘消失后视图将自动移回原点位置,但我没有编写任何代码来执行此操作。
提升的代码:
- (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];
}
我很久以前在另一个项目中做过这个,只是在第一时间没有记住它:(
答案 0 :(得分:0)
您必须在通知中心收听键盘事件,幸运的是,这是几乎每个应用都需要的功能,所以请检查:) https://github.com/aceontech/KBKeyboardHandler
它完全符合您的需要但我更喜欢您理解它的行为(注册系统通知)。
如果你想要
,也可以通过cocoapods获得pod' KBKeyboardHandler'
答案 1 :(得分:0)
好的,所以奇怪的行为是因为当键盘出现或消失时,它会重新显示视图控制器的子视图并触发-(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;
}
就像我提到的,这种方法仅适用于StoryBoard(Interface Builder)的视图,如果self.textFieldPanel
是由代码创建的,则应删除viewDidLayoutSubviews中的代码。