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”

+0

哦,谢谢,我忘了一年前在另一个项目中做过的听众。你知道它为什么会自动下移吗? – SnowWolf

+0

我不明白你的意思是自动下移,所以只需注册我给你的处理程序并实现委托方法:),当键盘出现或消失时它会通知你,因此你可以将视图向上或向下移动 –

+0

上下移动就像我说过的,很久以前我在另一个项目中做的事情就是不记得马上。这篇文章中的主要问题是弄清楚一些意想不到的行为,我假设文本字段。情况是我编写代码在键盘显示后移动视图。但是当我关闭键盘时,视图自动回到原始位置。由于没有代码可以移动视图,所以在我移动之后它应该保持这个位置。 – SnowWolf