当键盘出现时使用AutoLayout移动UIView

4

我有一个 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 坐标的指引。仅仅改变 frame 的 y 坐标是无效的。
在这里,你可以找到我的界面设置和我添加到 UIView 的约束条件。 Interface Setup 所以除了 UIImageView 外,所有的组件都包含在 loginView Outlet 中。这是我想要根据键盘是否显示而向上或向下移动的视图。
对我来说有点困难的是,正如你可能看到的,UIImageView 有一个固定的高度、宽度和垂直居中。

不要忘记 - (void)viewWillLayoutSubviews - 0yeoj
使用自动布局,您不需要调整视图框架。相反,调整导致视图框架的约束(在这种情况下,可能会使顶部空间到父视图的常量变小)。或者将视图放置在滚动视图上并滚动它。 - danh
是的,我会选择这个解决方案。看起来是最容易做的事情。目前更新约束对我来说并不真正有效。 - dehlen
3个回答

4

我刚刚完成了这个操作。基本上,将需要移动的所有内容放在一个容器视图中,然后与键盘显示/隐藏通知一起动画顶部约束常量。

UIKeyboardWillShowNotification
UIKeyboardDidHideNotification

在通知中有一个userInfo,它会告诉你键盘的高度,并让你的动画与键盘同步,实现平滑过渡。

看一下我的问题,我正在使用UINotifications。我该如何在程序中更改约束?我在故事板中定义了这些约束。 - dehlen
3
您可以创建一个指向限制条件的输出口,然后使用它来修改该条件的常数。 - Simon McLoughlin
对我不起作用。我添加了@property (nonatomic, weak) IBOutlet NSLayoutConstraint *topConstraint;并将输出连接到loginView和imageView之间的垂直空间。然后在代码中,我设置了self.topConstraint.constant = 0.0;但是视图根本没有移动。 - dehlen
你可能有其他限制使事情保持不变。请检查控制台以获取来自约束解析器的警告或错误信息。 - Michael

0
到目前为止,我所做的是获取我们想要上下移动的视图的 originalFrame。确保在 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。如果键盘被隐藏,我们将视图移回原始位置。

希望这有所帮助。


-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;
    }];
}

问题是关于自动布局的 - 使用框架属性会更容易 - Vyachaslav Gerchicov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接