为了确保在启用键盘的情况下表格视图中的文本字段始终可见,我想向上移动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
是否是这些约束的正确位置?
答案 0 :(得分:2)
如果您从界面构建器设置约束,那么您可以通过ctrl +拖动来获取任何约束的出口。然后你可以在键盘出现和隐藏时管理它。
如果以编程方式添加约束,则可以设置它的identifier
,并且通过该标识符可以在任何地方使用该约束,并且可以在键盘出现或消失时管理常量。
如果您不想管理所有这些内容,那么您可以使用出色的第三方库IQKeyboardmanager。
只需将其拖放到您的项目即可!你不需要做任何事情,一切都会自动管理。
希望这会有所帮助:)