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 的正则表达式 [重复]

Swift 在文本输入期间验证 2 uitextfield 密码

swift 点击Textfield 后自动上移,避免键盘被遮住