2016-10-04 2 views
0

Я пытаюсь оживить (вверх и вниз) все виды в viewController, когда пользователь переместится с textField на textField, где каждый textField имеет клавиатуру с разной высотой, и я используя автозапуск для размещения всех видов.Ограничение просмотра анимации без анимации других видов

Что у меня есть четыре UITextFields и три UIButtons использования autolayout и которые двигаются вверх и вниз на основе различных клавиатур высоты, моя проблема в том, что по какой-то причине всех представлений анимации, как только нагрузки ViewController которая не является что я хочу, я хочу, чтобы они оживлялись, когда высота клавиатуры отличается. Анимация выглядит так, что она оживляет все размеры и позиции вида, как только загружается viewController.

Для управления анимацией у меня есть основное ограничение (constraintKeyboardHeight), где все точки привязаны для определения их вертикального положения (см. Рисунок ниже).

FYI - Обратите внимание, что я автоматически фокусирую один из текстовых полей в методе viewDidLoad. Я не уверен, что это связано с этим.

Любая идея? Это обычное поведение при анимации представлений с ограничениями?

override func viewDidLoad() { 
    super.viewDidLoad() 

    oneTextField.becomeFirstResponder() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UserInputViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil) 
} 


func keyboardWillShow(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 

     keyboardHeight = keyboardSize.height + 10 

     UIView.animateWithDuration(3.0, animations: { 
     self.constraintKeyboardHeight.constant = keyboardHeight 
     self.view.layoutIfNeeded() 
     }) 
    } 
} 

enter image description here

ответ

1

Вызов self.view.layoutIfNeeded вызовет обновление макета для всего содержащегося в представлении. Если это включает subviews, вы не хотите анимировать, вы должны добавить все те, которые вы do хотите анимировать в подзаголовок контейнера. Ограничьте представление контейнера на основе клавиатуры и вызовите layoutIfNeeded только в этом подвью.

Я немного запутался

мой вопрос в том, что по какой-то причине все представления анимации, как только груз ViewController, который является не то, что я хочу, я только хочу, чтобы анимировать, когда высота клавиатуры различна.

и я интерпретирую проблему как «все виды анимации», где вам нужны только некоторые из них. Если проблема связана с анимацией сразу, это, конечно, произойдет, потому что вы установите первый ответчик правильно, когда загружается представление.

Edit: Если вы не хотите, чтобы оживить при первой загрузке, вы можете добавить свойство var firstLoad = true к контроллеру, а затем изменить клавиатуру будет показывать функцию следующим образом:

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo [UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
     keyboardHeight = keyboardSize.height + 10 
     self.constraintKeyboardHeight.constant = keyboardHeight 
     if firstLoad { 
      view.layoutIfNeeded() 
      firstLoad = false 
     } else { 
      UIView.animateWithDuration(3.0, animations: { 
       self.view.layoutIfNeeded() 
      }) 
     } 
    } 
} 

Вы заметите Я переместил строку константы ограничения из блока анимации. Вам действительно не нужна эта строка в блоке анимации, просто вызов layoutIfNeeded.

+0

@ Коннор Невилл. Проблема заключается в том, что анимации видны сразу, но, видимо, это ожидаемое поведение. Если я правильно понимаю это, 'self.view.layoutIfNeeded' обновляет все представления непосредственно в главном представлении от viewController, но почему анимация применяется ко всем представлениям, положению и размеру, если я только указываю на анимацию одно из ограничений? Я ожидал бы оживить все взгляды, но только вверх и вниз, чтобы приспособиться к значению этого ограничения. –

+1

Анимация происходит сразу, потому что клавиатура появляется сразу, что кажется мне разумным, но если вы не хотите анимации при первом загрузке, вы можете установить какой-то булевский флаг для первой загрузки.И да, это ожидаемое поведение layoutIfNeeded, потому что одно изменение ограничения может и часто меняет макет всего представления. – Connor

+0

@ Коннор Невилл - Теперь поймите. Еще один вопрос: как я могу отслеживать нагрузки? Это может решить мою проблему, поскольку анимационная работа, как я ожидаю, после первой загрузки. Если это слишком сложно, я поеду с добавлением представлений в один вид, как это было предложено в вашем ответе. Но мне любопытно посмотреть, как это делается. Благодарю. –

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