Текстовые переходы при анимации позиции подкласса UITextField
Когда я одушевляю местоположение моего подкласса UITextField
, текст в поле выходит из строя с расположением UITextField
, удерживающим его, что очень раздражает, и я не могу понять, почему это происходит:
![before]()
![during]()
![during]()
![during]()
![end]()
Мой подкласс добавляет кнопку в правую часть текстового поля, которая при вызове вызывает метод на контроллере представления, который изменяет цвет рамки поля и перемещает текстовое поле вверх по экрану, изменяя ограничение верхнего пространства текстовое поле и несколько других видов, расположенных над ним.
[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 комментирует ссылку, которая ссылается на Здесь, которое является лучшим решением, которое я могу найти для этой проблемы.