使用AutoLayout显示键盘时移动UIView

时间:2015-05-27 13:57:42

标签: ios objective-c autolayout uikeyboard

我有一个UIView,无论UIKeyboard出现还是消失,我都想上下移动。不幸的是,我无法让它发挥作用。 在AutoLayout之前,这是一个不费脑子的事情,但是自AutoLayout以来我遇到了这个问题。

这是我到目前为止所做的:

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification object:nil];
    self.keyboardIsShown = NO;

}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillShowNotification
                                                  object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillHideNotification
                                                  object:nil];
}


-(void)keyboardWillShow:(NSNotification*)notification{
    if (self.keyboardIsShown) {
        return;
    }

    //change y Position of self.loginView

    self.keyboardIsShown = YES;
}

-(void)keyboardWillHide:(NSNotification*)notification{
    //Change y Position of self.loginView
    self.keyboardIsShown = NO;
}

当然这些方法被调用但我需要一些关于如何更改UIView的y位置的指导。只是改变框架的y位置根本不起作用。

在这里,您可以找到我添加到UIView的约束的界面设置。 Interface Setup

因此UIImageView以外的所有组件都包含在loginView Outlet中。这是我想要根据键盘显示与否来移动或关闭的视图。

这对我来说很难,就像你可能看到的那样,UIImageView有一个固定的高度,宽度和垂直居中。

3 个答案:

答案 0 :(得分:4)

我刚刚完成了这件事。基本上,包装您在容器视图中移动所需的所有内容,然后与键盘显示/隐藏通知一起设置顶部约束常量的动画。

for (Animal animal : animals)

在通知中是一个userInfo,它会告诉您键盘的高度,还可以让您的动画与键盘同步,以实现平滑过渡。

答案 1 :(得分:0)

到目前为止,我所做的是获取我们想要上下移动的视图的原始框架。确保你在ViewDidAppear中得到它而不是ViewDidLoad

-(void)viewDidAppear:(BOOL)animated
{
    _loginHolderOriginalFrame = self.loginHolderView.frame;
}

以下功能将用于显示/隐藏键盘

-(void) _keyboardWillShow:(NSNotification *)note
{
    [self.view layoutIfNeeded];
    [UIView animateWithDuration:0.25 animations:^{
        self.logoImageView.alpha = 0;
        CGRect rect = _loginHolderOriginalFrame; // bounds
        rect.origin.y = 15;

        [self.loginHolderView setFrame:rect];
    }];
}

-(void) _keyboardWillHide:(NSNotification *)note
{
    [self.view layoutIfNeeded];
    [UIView animateWithDuration:0.5f animations:^{
        self.logoImageView.hidden = NO;
    }];

    [self restoreLoginFrame];
}

-(void)restoreLoginFrame
{
    [UIView animateWithDuration:0.25 animations:^{
        self.logoImageView.alpha = 1;
        [self.loginHolderView setFrame:_loginHolderOriginalFrame];
    }];
}

当我们显示键盘时,我们将视图向上移动到位置y,例如等于15.如果键盘被隐藏,我们将视图移回原始位置。

希望有所帮助。

答案 2 :(得分:-1)

  

键盘出现时移动UIView(没有滚动视图)


我最近也有一个非常相似的应用程序设计&除此之外没什么用。我有没有滚动视图只是一个视图&所有组件都在里面。

- (void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}


- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}



- (void)keyboardWillShow:(NSNotification *)notification
{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    [UIView animateWithDuration:0.3 animations:^{
        CGRect f = self.view.frame;
        f.origin.y = -keyboardSize.height;
        self.view.frame = f;
    }];
}

-(void)keyboardWillHide:(NSNotification *)notification
{
    [UIView animateWithDuration:0.3 animations:^{
        CGRect f = self.view.frame;
        f.origin.y = 0.0f;
        self.view.frame = f;
    }];
}