Swift:在自动格式化 UITextField 后动画 UIButton
Posted
技术标签:
【中文标题】Swift:在自动格式化 UITextField 后动画 UIButton【英文标题】:Swift: Animating UIButton after auto-formatting UITextField 【发布时间】:2015-05-17 22:21:50 【问题描述】:我有一个只接受数字的UITextField
。这是一个电话号码字段。一旦字段中有 10 个字符(区号 + 号码),我将 textField.text
字符串转换为 NSMutableString
以将其格式化为电话号码。
现在,一旦格式发生,我需要为我的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:
时,它根本不会被调用。
【问题讨论】:
我不知道这是否会导致您的问题,但如果您在 IB 中使用自动布局,则不应设置 center 属性,您应该修改约束以动画按钮的位置。 不,不是这样。UIView.animateWithDuration()
实际上被调用了,因为我在完成处理程序中使用了 println()
进行测试,但按钮本身没有出现。
你在使用自动布局吗?即使这不是您的直接问题,您仍然应该在使用自动布局时设置框架(或中心)。
是的,UIButton
设置为水平和垂直中心、高度以及尾随/前导空格到边距
感觉跟count(phoneNumber.text)
不是自动刷新有关...
【参考方案1】:
如果你开启了自动布局,你应该这样做,
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: 函数(只有文本字段中的用户输入调用它)。在上面的代码中,请注意动画在 case 10(因此它发生在格式化之后)和 case 14(以防您退格然后添加更多数字)中都被调用。
【讨论】:
按钮根本不显示。编译器告诉我它正在尝试通过打破约束来恢复并在UIViewAlertForUnsatisfiableConstraints
处创建一个符号断点
@DavidPerkins 您应该删除按钮的前导和尾随约束。你只需要 centerX 和 centerY。
啊,是的。但是如果没有前导和尾随约束,我的按钮(应该跨越屏幕的宽度)很短。如何以编程方式设置宽度约束?
@DavidPerkins 您不需要以编程方式设置它。你可以在 IB 中给它一个宽度约束。一个固定的数字,或者你可以让它等于超级视图的宽度(减去你想要的任何填充)。以上是关于Swift:在自动格式化 UITextField 后动画 UIButton的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中自动移动到下一个 UITextField
Swift UITextField:在自动布局中创建一个动态减小的 UITextField 框架
在 UITextField swift 3.0 中使用数字键盘以 dd-MM-yyyy 格式输入日期
用于在 Swift 中为 UITextField 验证 Civil ID 的正则表达式 [重复]