出现键盘时移动具有自动布局约束的文本字段

Moving a textfield with auto layout constraints when the keyboard appears

我有一个搜索栏文本字段和一个 table 视图(用于 google 自动完成),我想在键盘出现时向上翻译。我成功地做到了这一点,但是,我得到 warnings/errors 关于我的限制。我在此视图上通过故事板使用自动布局,并尝试 disable/enable 在 to/after showing/hiding 键盘之前的约束,但我仍然遇到这些错误。我没有正确禁用自动布局吗?我遵循了 this SO 回复中给出的内容。

override func viewDidLoad() {
    ...
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil)
    ...
}
func keyboardWillShow(sender: NSNotification) {
    self.pixieLabel.hidden = true
    self.searchBar.setTranslatesAutoresizingMaskIntoConstraints(true)
    self.startingTableView.setTranslatesAutoresizingMaskIntoConstraints(true)
    self.searchBar.frame.origin.y -= 150
    self.startingTableView.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
    self.pixieLabel.hidden = false
    self.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.startingTableView.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.searchBar.frame.origin.y += 150
    self.startingTableView.frame.origin.y += 150
}

解决方案代码

func keyboardWillShow(sender: NSNotification) {
    self.pixieLabel.hidden = true
    self.seachBarTopConstraint.constant -= 150
    self.searchBar.layoutIfNeeded()
}
func keyboardWillHide(sender: NSNotification) {
    self.pixieLabel.hidden = false
    self.seachBarTopConstraint.constant += 150
    self.searchBar.layoutIfNeeded()
}

我认为您应该在 Interface Builder 中创建对约束的 @IBOutlet 引用,然后在需要时更改这些约束的 constant 值,而不是调整 frame 值为它们设置动画,然后调用 layoutIfNeeded。据我了解,手动更改视图框架和自动布局的值不能混淆。

此外,除非您以编程方式添加约束,否则我不会乱用 setTranslatesAutoresizingMaskIntoConstraints,在这种情况下,您很可能只是将其设置为 false