键盘消失后iOS视图自动向下移动

时间:2015-01-27 17:42:28

标签: ios objective-c keyboard

我有一个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 个答案:

答案 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中的代码。