【问题标题】:Move UIView when Keyboard appears with AutoLayout当键盘出现自动布局时移动 UIView
【发布时间】:2017-05-05 15:25:14
【问题描述】:

我有一个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 的约束的界面设置。

所以除了UIImageView 之外的所有组件都包含在loginView Outlet 中。这是我想根据键盘是否显示上下移动的视图。

对我来说有点困难的是,正如您所见,UIImageView 具有固定的高度、宽度和垂直居中。

【问题讨论】:

  • 别忘了- (void)viewWillLayoutSubviews
  • 使用自动布局,您无需调整视图框架。而是调整导致视图框架的约束(在这种情况下,超级视图常量的顶部空间可能会变小)。或者将视图放在滚动视图上并滚动它。
  • 是的,我会采用这个解决方案。看起来是最容易做的事情。目前,更新约束对我来说真的不起作用。

标签: ios objective-c autolayout uikeyboard


【解决方案1】:

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

UIKeyboardWillShowNotification
UIKeyboardDidHideNotification

通知中有一个用户信息,它将告诉您键盘的高度,还可以让您的动画与键盘同步以实现平滑过渡。

【讨论】:

  • 看看我正在使用 UINotifications 的问题。我将如何以编程方式更改约束?我在故事板中定义了约束。
  • @unverschaemt 您可以为约束创建一个出口,然后用它修改它的常量
  • 对我不起作用。我添加了@property (nonatomic, weak) IBOutlet NSLayoutConstraint *topConstraint; 并将插座连接到loginView 和imageView 之间的垂直空间。然后在代码中我设置self.topConstraint.constant = 0.0; 但是视图根本不动。
  • 您可能还有其他限制条件来保持原状。检查控制台是否有来自约束解析器的警告或错误。
【解决方案2】:

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

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    当键盘出现时移动 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;
        }];
    }
    

    【讨论】:

    • 问题是关于自动布局 - 使用 frame 属性更容易
    猜你喜欢
    • 2013-05-21
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多