【问题标题】:iOS view move down automatically after keyboard disappear键盘消失后iOS视图自动下移
【发布时间】:2015-01-27 17:42:28
【问题描述】:

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

很久以前我在另一个项目中做过这个,只是一开始不记得了:(

【问题讨论】:

    标签: ios objective-c keyboard


    【解决方案1】:

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

    它完全符合你的需要,但如果你能理解它的行为方式(注册系统通知),我更喜欢它。

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

    pod 'KBKeyboardHandler'

    【讨论】:

    • 哦,谢谢,我忘记了一年前在另一个项目中做的监听器。你知道它为什么会自动向下移动吗?
    • 我不明白你说的自动向下移动是什么意思,所以只需注册我给你的处理程序并实现委托方法:) 它会在键盘出现或消失时通知你,所以你可以向上或向下移动您的视图
    • 上下移动就像我很久以前在另一个项目中说的那样完成了,只是不记得了。这篇文章的主要问题是找出文本字段的一些意外行为。情况是我编写了代码以在键盘出现后向上移动视图。但是当我关闭键盘时,视图会自动回到原来的位置。由于没有移动视图的代码,所以在我向上移动后它应该保持位置。
    • 正如我告诉你的朋友,请转到链接,实现委托方法并阅读其中的注释,它会在 3-4 行代码中解决你的问题
    • 实施是一回事,了解幕后发生的事情是另一回事。我自己解决了。
    【解决方案2】:

    好的,所以奇怪的行为是因为当键盘出现或消失时,它将重新布局视图控制器的子视图并触发-(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(界面生成器)中的视图,如果 self.textFieldPanel 是由代码创建的,则应删除 viewDidLayoutSubviews 中的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多