键盘出现时以编程方式更新约束

时间:2016-05-27 13:22:22

标签: ios swift constraints ios-autolayout

为了确保在启用键盘的情况下表格视图中的文本字段始终可见,我想向上移动tableview,以防它覆盖控件。 我有问题与程序化应用autolayout结合使用。

tableview的约束定义如下:

override func viewWillLayoutSubviews() {
    let views = ["tableView": tableView]

    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))

    let topConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    self.view.addConstraint(topConstraint)

    bottomConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)
    self.view.addConstraint(bottomConstraint)
}

要通过NSNotificationCenter检测键盘,会调用以下方法(基于Getting keyboard size from userInfo in Swift的答案):

func keyboardWillHide(sender: NSNotification) {
            bottomConstraint.constant = 0.0
            UIView.animateWithDuration(0.2, animations: { () -> Void in self.view.layoutIfNeeded() })
     }

func keyboardWillShow(sender: NSNotification) {
    if let userInfo = sender.userInfo {
        if let keyboardHeight = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size.height {
            self.view.layoutIfNeeded()

            bottomConstraint.constant = keyboardHeight
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.view.layoutIfNeeded()
            })
        }
    }
}

但是,使用此代码时,约束不会正确更新。而是出现以下错误:

Unable to simultaneously satisfy constraints.
…
(
    "<NSLayoutConstraint:0x109941b50 UITableView:0x1028ea600.bottom == UIView:0x10993b930.bottom>",
    "<NSLayoutConstraint:0x102417290 UITableView:0x1028ea600.bottom ==     UIView:0x10993b930.bottom + 271>"
)

为什么约束没有更新? viewWillLayoutSubviews是否是这些约束的正确位置?

1 个答案:

答案 0 :(得分:2)

如果您从界面构建器设置约束,那么您可以通过ctrl +拖动来获取任何约束的出口。然后你可以在键盘出现和隐藏时管理它。

如果以编程方式添加约束,则可以设置它的identifier,并且通过该标识符可以在任何地方使用该约束,并且可以在键盘出现或消失时管理常量。

如果您不想管理所有这些内容,那么您可以使用出色的第三方库IQKeyboardmanager

只需将其拖放到您的项目即可!你不需要做任何事情,一切都会自动管理。

希望这会有所帮助:)