动态移动(动画)UITextField

我一直试图为UITextField设置动画,使其y位置增加50px。 基本上,它向上移动了五十个像素。 这是我的代码:

@IBAction func textField(sender: AnyObject) { let x = self.pw.frame.origin.x let y = self.pw.frame.origin.y + 100 UIView.animateWithDuration(0.5, delay: 0, options: nil, animations: { self.pw.frame = CGRectMake(x, y, self.pw.frame.size.width, self.pw.frame.size.height) }, completion: nil) 

它位于textField的委托中。 点击UITextField时会运行此代码。

遗憾的是,这段代码没有达到我想要的目的。 运行时,它会将文本字段向上移动50个像素,然后向右移动它。 它没有完成它本应该是它的最终位置。

如评论中所述,当您安装了自动布局约束时,不应手动修改框架。 相反,您需要更改约束以反映动画的最终结果。

以下是一个最小的工作示例。 它创建一个按钮和一个文本字段,并最初将文本字段定位在按钮末端下方58个点。 点击按钮时,文本字段顶部间距约束的常量从58减少到8,以向上移动文本字段。

 class ViewController: UIViewController { var textFieldTopSpacingConstraint: NSLayoutConstraint? override func viewDidLoad() { super.viewDidLoad() // Create the button let button = UIButton.buttonWithType(.System) as! UIButton button.setTranslatesAutoresizingMaskIntoConstraints(false) button.setTitle("Tap me!", forState: .Normal) button.addTarget(self, action: "buttonTapped", forControlEvents: .TouchUpInside) view.addSubview(button) // Create the text field let textField = UITextField() textField.placeholder = "Enter text here" textField.setTranslatesAutoresizingMaskIntoConstraints(false) view.addSubview(textField) let views: [NSObject: AnyObject] = ["button": button, "textField": textField] // Layout the button view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[button]-|", options: nil, metrics: nil, views: views)) view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[button(44)]", options: nil, metrics: nil, views: views)) // Layout the text field and remember its top spacing constraint view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[textField]-|", options: nil, metrics: nil, views: views)) textFieldTopSpacingConstraint = NSLayoutConstraint(item: textField, attribute: .Top, relatedBy: .Equal, toItem: button, attribute: .Bottom, multiplier: 1, constant: 58) // The text field starts 58 points below the end of the button view.addConstraint(textFieldTopSpacingConstraint!) } func buttonTapped() { // Change to constant on the top spacing constraint to move the text field up UIView.animateWithDuration(0.5) { self.textFieldTopSpacingConstraint?.constant = 8 // The text field now starts 8 points below the end of the button self.view.layoutIfNeeded() } } } 

通过Interface Builder设置约束后,可以在视图控制器中为顶部间距约束创建一个出口,并使用它来修改文本字段的顶部空间。

你期望pw帧移动100,但是在设备/模拟器上它只有50,这是由于像素和点之间的差异(看看这里 )。 至于框架返回其原始位置,您应该检查其余的代码。