Déplacer dynamicment (animer) un UITextField

J'ai essayé d'animer un UITextField de sorte que sa position y augmente de 50px. Fondamentalement, il monte de cinquante pixels. C'est mon code:

@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) 

C'est dans un délégué de textField. Ce code est exécuté lorsque UITextField est sélectionné.

Ce code, malheureusement, ne fait pas ce que je veux. Lorsqu'il est exécuté, il déplace le champ de text de 50 pixels, puis le redéplie. Il n'en finit pas avec ce qui est censé être sa position finale.

Comme mentionné dans les commentaires, vous ne devez pas modifier manuellement les frameworks lorsque vous avez installé des contraintes de layout automatique. Au lieu de cela, vous devez modifier vos contraintes pour refléter le résultat final de l'animation.

Ce qui suit est un exemple de travail minimal. Il crée un button et un champ de text et positionne initialement le champ de text 58 points en dessous de la fin du button. Lorsque vous appuyez sur le button, la constante sur la contrainte d'espacement supérieure du champ de text est réduite de 58 à 8 pour déplacer le champ de text vers le haut.

 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, mesortingcs: nil, views: views)) view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[button(44)]", options: nil, mesortingcs: nil, views: views)) // Layout the text field and remember its top spacing constraint view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[textField]-|", options: nil, mesortingcs: nil, views: views)) textFieldTopSpacingConstraint = NSLayoutConstraint(item: textField, atsortingbute: .Top, relatedBy: .Equal, toItem: button, atsortingbute: .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() } } } 

Lorsque vous avez configuré vos contraintes via Interface Builder, vous pouvez créer une sortie pour la contrainte d'espacement supérieure dans votre controller de vue et l'utiliser pour modifier l'espace supérieur du champ de text.

Vous vous attendez à ce que le frame pw bouge de 100, mais à la place sur le device / simulator c'est seulement 50, c'est à cause de la différence entre les pixels et les points (regardez ici ). Comme le cadre revient à sa position d'origine, vous devriez vérifier le rest de votre code.