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 然后添加更多数字)。
我有一个只接受数字的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 然后添加更多数字)。