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

时间:2015-06-06 21:26:50

标签: ios swift autolayout constraints

我有一个搜索栏文本字段和一个表格视图(用于谷歌自动完成),我想在键盘进入视图时翻译。我成功地做了这个,但是,我收到关于我的约束的警告/错误。我在此视图上使用故事板进行自动布局,并尝试在显示/隐藏键盘之前/之后禁用/启用约束,但我仍然遇到这些错误。我没有正确禁用自动布局吗?我按照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
}

enter image description here

解决方案代码

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()
}

1 个答案:

答案 0 :(得分:3)

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

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