TextFieldDidEndEditing перемещает экран, когда он не нужен

В моем приложении мои UITextFields расположены ниже, где находится верхняя часть клавиатуры, поэтому мне нужно переместить мой просмотр так, чтобы текстовое поле было видно по клавиатуре, когда я редактирую. Для этого я использую метод UITextFieldDelegate, textFieldDidBeginEditing:. Затем в методе textFieldDidEndEditing:, я перемещаю вид назад.

Проблема возникает, когда я пытаюсь переключаться между текстовыми полями. Когда я это сделаю, делегат вызывает метод textFieldDidEndEditing: затем сразу вызывает textFieldDidBeginEditing: для другого текстового поля, что делает представление вниз, а затем сразу вверх, поэтому он выглядит как толчок экрана. Есть ли способ обхода этого эффекта?

+3
источник поделиться
4 ответа

У меня только одна и та же проблема, и это решение, к которому я пришел.

Настройте отдельный метод обработки, когда клавиатура textField будет списана, и разместите там свою перестройку self.view.center. Таким образом, вы можете гарантировать, что ваш метод textFieldDidEndEditing будет разделен.

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

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    UIBarButtonItem *hideKeyboardButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(resignResponder:)];
    [self.navigationItem setRightBarButtonItem:hideKeyboardButton animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {

//Nothing needs to go here anymore

}

- (void)resignResponder:(id)sender {
    [textField resignFirstResponder];
    //Use core animation instead of the simple action below in order to reduce 'snapback'
    self.view.center = CGRectMake(0, 0, 320, 480);
}
+1
источник

Просто проверьте, в каком текстовом поле вы находитесь (например, дайте им tag s). Затем в соответствии с этой информацией переместите или не перемещайте свое представление.

0
источник

Я думаю, что лучший способ переместить текстовое поле - зарегистрироваться для уведомлений

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

Сделайте модификацию рамки текстового поля в keyboardWillShow: и keyboardWillHide:

0
источник

Я использовал другой подход для решения этой проблемы: При переключении с одного элемента управления редактированием на другое (поле1 → поле2) вы получаете следующие сообщения:

  • textFieldShouldBeginEditing (field2)
  • textFieldShouldEndEditing (field1)
  • textFieldDidEndEditing (поле1)
  • textFieldDidBeginEditing (поле2)

Я использую переменную-счетчик (x):

  • Добавить x + = 1 в textFieldShouldBeginEditing
  • Добавить x- = 1 в textFieldShouldEndEditing

Тогда:

  • в textFieldDidEndEditing растягивает элементы управления в исходное положение, если x < 0
  • в textFieldDidBeginEditing сворачивает элементы управления, если x > 0
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос