2015-05-17 19 views
1

我有一個UITextField只需要數字。這是一個電話號碼字段。一旦該字段中有10個字符(區號+數字),我將textField.text字符串轉換爲NSMutableString以將其格式化爲電話號碼。Swift:自動格式化UITextField後動畫UIButton

現在,一旦格式發生,我需要動畫我的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:時,它根本不會被調用。

+0

我不知道這是否會導致你的問題,但如果你在IB中使用自動佈局,你不應該設置中心屬性,你應該修改約束來動畫按鈕的位置。 – rdelmar

+0

不,那不是。 'UIView.animateWithDuration()'實際上是被調用的,因爲我在完成處理程序中使用了'println()'來測試,但是按鈕本身沒有出現。 – chicobermuda

+0

你使用自動佈局嗎?即使這不是你的直接問題,在使用自動佈局時,你仍然應該設置框架(或中心)。 – rdelmar

回答

0

如果你已經自動佈局打開,你應該這樣做這樣的事情,

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(在您退回空間然後添加更多數字的情況下)也被調用。

+0

該按鈕根本不顯示。編譯器告訴我它試圖通過中斷約束來恢復,並在'UIViewAlertForUnsatisfiableConstraints'處做一個符號斷點。 – chicobermuda

+0

@DavidPerkins你應該刪除你的按鈕的前後約束。你只需要centerX和centerY。 – rdelmar

+0

啊,這是有效的。但是沒有前後約束,我的按鈕(它應該跨越屏幕的寬度)很短。我將如何以編程方式設置寬度約束? – chicobermuda