Swift:在自动格式化 UITextField 后为 UIButton 设置动画

Swift: Animating UIButton after auto-formatting UITextField

我有一个只接受数字的UITextField。这是一个 phone 数字字段。一旦字段中有 10 个字符(区号 + 号码),我将 textField.text 字符串转换为 NSMutableString 以将其格式化为 phone 号码。

现在,一旦格式发生,我需要为我的 UIButton 制作动画,让用户以相同的格式继续到下一页,但格式和按钮动画不会发生在同时。我可以输入 10 个字符,自动格式化,退格一个字符,输入另一个数字,然后按钮会显示,但永远不会在同一个动作中。

@IBOutlet weak var submitButton: UIButton!
@IBOutlet weak var phoneNumber: UITextField!

    @IBAction func phoneNumberDidChange(sender: AnyObject) {

        switch count(phoneNumber.text) {
        case 10:
            var formattedNumber : NSMutableString = NSMutableString(string: self.phoneNumber.text)
            formattedNumber.insertString("(", atIndex: 0)
            formattedNumber.insertString(")", atIndex: 4)
            formattedNumber.insertString(" ", atIndex: 5)
            formattedNumber.insertString("-", atIndex: 9)
            self.phoneNumber.text = formattedNumber as String
        case 14:
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.submitButton.center = CGPointMake(self.view.center.x, self.view.center.y)
            })
        default:
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.submitButton.center = CGPointMake(self.submitButton.center.x - 400, self.submitButton.center.y)
            })
        }
    }

override func viewDidLayoutSubviews() {

        submitButton.center = CGPointMake(submitButton.center.x - 400, submitButton.center.y)

    }

如何在同一动作中获得自动格式和按钮动画?当我将 UIView.animateWithDuration() 添加到 case 10: 时,它根本不会被调用。

如果你打开了自动布局,你应该这样做,

class ViewController: UIViewController {

    @IBOutlet weak var submitButton: UIButton!
    @IBOutlet weak var phoneNumber: UITextField!
    @IBOutlet weak var centerCon: NSLayoutConstraint! // IBOutlet to a centerX constraint on the button

    override func viewDidLoad() {
        centerCon.constant = self.view.frame.size.width/2 + submitButton.frame.size.width // puts the button just off screen to the left
    }


    @IBAction func phoneNumberDidChange(sender: AnyObject) {

        switch count(phoneNumber.text) {
        case 10:
            var formattedNumber : NSMutableString = NSMutableString(string: self.phoneNumber.text)
            formattedNumber.insertString("(", atIndex: 0)
            formattedNumber.insertString(")", atIndex: 4)
            formattedNumber.insertString(" ", atIndex: 5)
            formattedNumber.insertString("-", atIndex: 9)
            self.phoneNumber.text = formattedNumber as String

            self.centerCon.constant = 0
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.view.layoutIfNeeded()
            })

        case 14
             self.centerCon.constant = 0
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.view.layoutIfNeeded()
            })

        default:
            centerCon.constant = self.view.frame.size.width/2 + submitButton.frame.size.width
            UIView.animateWithDuration(0.2, animations: { () -> Void in
                self.view.layoutIfNeeded()
            })
        }
    }
}

你的案例 14 永远不会被调用,因为在代码中格式化字符串不会调用你的 phoneNumberDidChange: 函数(只有用户在文本字段中输入调用它)。在上面的代码中,请注意在两种情况下都会调用动画 10(因此它会在格式化后立即发生)和情况 14(如果您返回 space 然后添加更多数字)。