Текстовые переходы при анимации позиции подкласса UITextField

Когда я одушевляю местоположение моего подкласса UITextField, текст в поле выходит из строя с расположением UITextField, удерживающим его, что очень раздражает, и я не могу понять, почему это происходит: beforeduringduringduringend

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

[UIView animateWithDuration:0.3
                     animations:^{
                         self.tableViewBottomSpaceConstraint.constant = 0;
                         self.mainLabelHeightConstraint.constant = 0;
                         self.subLabelTopSpaceConstraint.constant = 0;
                         self.postCodeFieldTopSpaceConstraint.constant = 12;
                         [self.view layoutIfNeeded];

                     }];

Ответ 1

i зафиксировал это. измените свой код на это. Он будет работать.

[UIView animateWithDuration:0.3
                 animations:^{
                     self.tableViewBottomSpaceConstraint.constant = 0;
                     self.mainLabelHeightConstraint.constant = 0;
                     self.subLabelTopSpaceConstraint.constant = 0;
                     self.postCodeFieldTopSpaceConstraint.constant = 12;
                     [self.view layoutSubviews];

                 }];

или если это не работает, вместо

[self.view layoutSubviews];

используйте родительский вид текстового поля и layoutSubviews. В моем случае это сработало. Я думаю, что этот ответ подходит для щедрости. Спасибо.

ИЗМЕНИТЬ:

Я нашел причину этого. Когда мы пытаемся выполнить layoutIfNeeded, это означает, что он сначала меняет внешний макет, и после того, как он меняет свой макет, он меняет внутренний текст UITextField, потому что мы не сильно меняем макет всех подзонов этого текстового поля. В конце концов UITextField состоит из UIView и Label и других базовых элементов. Но когда мы пытаемся layoutSubviews его изменения макета всех subviews одновременно. Вот почему отскок ушел.

Ответ 2

Похоже, что по какой-то причине ваш пользовательский интерфейс не находится в состоянии состояния до запуска анимации.

Попробуйте добавить вызов [self.view layoutIfNeeded]; перед блоком анимации и используйте [self.view layoutIfNeeded]; в конце вашего блока, а не [self.view layoutSubviews];, который в действительности не должен использоваться в этом контексте.

Ответ 3

Для iOS 9 или выше это решает проблему

Objective-C:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
 }

Swift:

  func textFieldDidEndEditing(_ textField: UITextField) {
    textField.layoutIfNeeded() //Fixes iOS 9 text bounce glitch
    //...other stuff
  }

Google принимает меня сюда. В ответе @Mahesh Agrawal @Andy комментирует ссылку, которая ссылается на Здесь, которое является лучшим решением, которое я могу найти для этой проблемы.