更改自动布局锚点约束

时间:2018-03-05 18:45:14

标签: swift uitextfield ios-autolayout

我有UITextField,我正试图在键盘出现时改变它的位置。更具体地说,我想将文本字段向上移动,使其位于键盘上方。我的代码看起来像这样

let textField = myCustomTextField()

override func viewDidLoad() {
     //set up textfield here
     //constrains blah blah

     textField.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,
          constant: -view.bounds.height * 0.05).isActive = true

     //more constraints
}

我接下来要做的是更改该约束,以便在键盘出现时提升文本字段。我的代码如下所示:

 @objc func keyboardWillShow(notification: NSNotification) {
     textField.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,
          constant: -view.bounds.height * 0.05).constant = 200 //200 is a sample number I have a math calculation there
     textField.layoutIfNeeded()
} 

这不起作用,因为仅使用constraint(equalTo: constant:)引用该约束实际上不会返回任何约束。有没有办法引用该约束而不为我想要更改的每个约束创建变量并更改其常量?

1 个答案:

答案 0 :(得分:0)

您的代码的问题在于您创建了第二个约束而不是更改当前,您应该保持对创建的引用并更改它的常量,您可以像这样引用它

var bottomCon:NSLayoutConstraint?

override func viewDidLoad() {

   bottomCon =  textField.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,
      constant: -view.bounds.height * 0.05)
   bottomCon.isActive = true

 }

然后你可以用任何方法访问它并使用常量属性

编辑:为您创建的每个约束分配标识符并按以下方式访问

 let textFieldCons= button.constraints.filter { $0.identifier == "id" }
 if let botCons = textField.first {
      // process here
    }