2015-05-17 3 views
1

У меня есть UITextField, который принимает только цифры. Это поле номера телефона. Если в поле есть 10 символов (код области + номер), я конвертирую строку textField.text в NSMutableString, чтобы отформатировать ее на номер телефона.Swift: Анимация UIButton после автоматического форматирования UITextField

Теперь, когда формат имеет место, мне нужно анимировать мой 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. Вы должны удалить основные и конечные ограничения для вашей кнопки. Вам нужен только центр X и centerY. – rdelmar

+0

Ах да, что работает. Но без ведущих и конечных ограничений моя кнопка (которая должна охватывать ширину экрана) коротка. Как бы программным образом установить ограничение ширины? – chicobermuda

Смежные вопросы