我有一个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];
}
我很久以前在另一个项目中做过这个,只是在第一个地方没记住它:(
2 回答
您必须在通知中心收听键盘事件,幸运的是,这是几乎每个应用程序都需要的功能,所以请检查这个:) https://github.com/aceontech/KBKeyboardHandler
它完全符合您的需要但我更喜欢您是否理解它的行为(注册系统通知) .
如果你愿意,它也可以通过cocoapods获得
pod'KBKeyboardHandler'
好的,所以奇怪的行为是因为当键盘出现或消失时,它将重新布局视图控制器的子视图并触发
-(void)viewDidLayoutSubviews
并将视图重新定位回到StoryBoard 's position. If the view is created by code then this won' t是一个问题 .除了为KeyBoard添加通知之外,我们还需要在viewDidLayoutSubviews中重新定位视图,因为在布局子视图之前触发了通知 .
在viewDidLayoutSubviews中:
就像我提到的,这种方法仅适用于StoryBoard(Interface Builder)的视图,如果
self.textFieldPanel
是由代码创建的,则应删除viewDidLayoutSubviews中的代码 .