swift - 在具有约束的 UIView 中移动 UITextField

标签 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 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 之前,效果很好。那么它只会工作一次。就像我点击制作它会向上移动 -50,或者如果我点击颜色它会向上移动 -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。但随后它不会向下移动,就像我再次单击 Make 它不会向下移动到 -50 一样。我什至将颜色设置为 +50。当我单击颜色时,它会下降 +50,然后当我单击“制作”时,它会向上移动到 -50,而模型会将它向上移动 -75。但如果我再次单击颜色,它不会回落到 +50。我哪里错了?

最佳答案

问题是你每次移动都添加约束,这随着时间的推移会产生冲突,所以你只需要添加一次约束,并调整你想要移动的约束的常量值,而不是这样做

1- 在 viewDidLoad 中添加这段代码

var bottomConstraint:NSLayoutConstraint!

//

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)

2-

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

如果你愿意,你可以用topConstraint做同样的事情

关于swift - 在具有约束的 UIView 中移动 UITextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829484/

相关文章:

iphone - 推特 ios4 ..账户框架

objective-c - UISwipeGestureRecognizer 未触发

ios - 当应用程序进入后台时返回主视图 Controller

ios - 在 View Controller 之间传递数据

ios - 你如何在没有 iPhone 的情况下调试 iPhone 应用程序?

ios - 字符串不符合协议(protocol) "intervalType"

ios - 无论触摸内部 View ,PointInside 方法都会返回 false

Swift Comparable Protocol 优于方法

ios - 如何将 subview 放置在具有动态高度的 subview 下方?

iphone - UIAnimation 阻止奇怪的行为