Swift 在具有约束的UIView中移动UITextField

Swift 在具有约束的UIView中移动UITextField,swift,xcode,uiview,uitextfield,constraints,Swift,Xcode,Uiview,Uitextfield,Constraints,我正在制作一个应用程序,用户可以输入他们的汽车信息。我需要UITextFields向上移动,以便它们不被键盘覆盖。我是用这个代码做的 func textFieldDidBeginEditing(_ textField: UITextField) { if make==textField { self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-50) } if

我正在制作一个应用程序,用户可以输入他们的汽车信息。我需要UITextFields向上移动,以便它们不被键盘覆盖。我是用这个代码做的

func textFieldDidBeginEditing(_ textField: UITextField)
{
    if make==textField
    {
        self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-50)
    }
    if model==textField
    {
        self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-75)
    }
    if color==textField
    {
        self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-100)
    }
}
在我向UIView*infoContainer添加约束之前,这一点非常有效。那么它只能工作一次。比如,如果我点击Make,它会向上移动-50,或者如果我点击color,它会向上移动-100。但在那一次之后,它不会再移动了。比如,如果我点击Make,它会向上移动-50,但是如果我点击Color,它不会移动到-100。然后我试着改变约束条件

func textFieldDidBeginEditing(_ textField: UITextField)
    {
        if make==textField
        {
            infoContainer.translatesAutoresizingMaskIntoConstraints = false

            self.view.addSubview(infoContainer)

            let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
            let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
            let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
            let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)

            initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])

            NSLayoutConstraint.activate(initialConstraints)
        }
        if model==textField
        {
            infoContainer.translatesAutoresizingMaskIntoConstraints = false

            self.view.addSubview(infoContainer)

            let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
            let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
            let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -75)
            let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -75)

            initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])

            NSLayoutConstraint.activate(initialConstraints)
        }
        if color==textField
        {
            infoContainer.translatesAutoresizingMaskIntoConstraints = false

            self.view.addSubview(infoContainer)

            let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
            let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
            let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -100)
            let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -100)

            initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])

            NSLayoutConstraint.activate(initialConstraints)
        }
    }

这个效果好一点。如果我点击使其向上移动-50,然后模型向上移动-75,然后颜色向上移动-100。但它不会向下移动,就像我单击“后退”使它不会向下移动到-50。我甚至将颜色设置为+50。当我点击颜色时,它会下降+50,然后当我点击Make时,它会上升到-50,Model会上升到-75。但如果我再次单击“颜色”,它将不会移回+50。我哪里出错了?

问题是每次移动都要添加约束,这会随着时间的推移产生冲突,因此只需添加一次约束,然后调整要移动的约束的常量值,而不是执行此操作

1-将此代码段添加到
viewDidLoad

var bottomConstraint:NSLayoutConstraint!
//

二,-

如果愿意,您也可以对
topConstraint
执行相同的操作

infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
func textFieldDidBeginEditing(_ textField: UITextField)
{
    if make == textField
    {
        self.bottomConstraint.constant = -50
    }
    if model == textField
    {
        self.bottomConstraint.constant = -75
    }
    if color == textField
    {
        self.bottomConstraint.constant = -100
    }

   self.view.layoutIfNeeded()

   // you can animate it to

   /*
    UIView.animate(withDuration:0.5) {
      self.view.layoutIfNeeded()
    } */
}