首页 文章

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

提问于
浏览
0

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

    您必须在通知中心收听键盘事件,幸运的是,这是几乎每个应用程序都需要的功能,所以请检查这个:) https://github.com/aceontech/KBKeyboardHandler

    它完全符合您的需要但我更喜欢您是否理解它的行为(注册系统通知) .

    如果你愿意,它也可以通过cocoapods获得

    pod'KBKeyboardHandler'

  • 0

    好的,所以奇怪的行为是因为当键盘出现或消失时,它将重新布局视图控制器的子视图并触发 -(void)viewDidLayoutSubviews 并将视图重新定位回到StoryBoard 's position. If the view is created by code then this won' t是一个问题 .

    除了为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中的代码 .

相关问题