键盘显示时更改自动布局常量

change autolayout constant when keyboard shows

我有一个 TopContainer 视图,然后是一个 Scrollview,然后又是一个 BottomContainer 视图。

现在的约束是滚动视图的顶部位于 topContainer 的底部,滚动视图的底部位于 bottomcontainer 的顶部。

当我启动 viewcontroller 并看到视图层次结构时它很好。

但是当键盘显示时,我想修改自动布局约束,使底部容器向上移动。

所以我想我保存约束并像这样更改常量:

private var toolbarBottomConstraint: NSLayoutConstraint?
self.toolbarBottomConstraint = self.toolbar.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 0)

然后当键盘弹出时我这样做:

func keyboardWillShow(notification:NSNotification){
    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
    keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil)

    self.toolbarBottomConstraint?.constant = keyboardFrame.size.height
}

这没有任何作用。键盘高度正好是底部需要在键盘顶部的偏移量。

为什么视图没有改变?我总是像那样更改常量并且它总是有效。我是否需要做一些特别的事情,因为它现在与键盘一起使用。

你试过在设置约束后调用setNeedsLayout()吗?:

self.toolbarBottomConstraint?.constant = keyboardFrame.size.height
self.view.setNeedsLayout()

如果您正在为 iOS 9 或更高版本构建,我写了一个 simple library 来负责在出现键盘时自动调整视图。它非常灵活,应该可以无缝工作。

如果您仍然想自己滚动它,那么您似乎还没有在任何地方为通知添加侦听器。在将消息发送到 keyboardWillShow(_:) 方法之前,您需要这样做。