UIKeyboardWillShowNotification, UIKeyboardWillHideNotification и NSNotificationCenter проблема между версиями iOS

У меня есть несколько UITextFields в моем представлении (каждое внутри UITableViewCell). Когда клавиатура запускается из любого текстового поля, мне нужно сделать некоторые анимации, в основном, чтобы изменить кадр UITableView. То же самое должно произойти, когда клавиатура скроется.

Я сделал анимацию, так что это не проблема здесь.

Теперь я использую NSNotificationCenter, чтобы поймать отображение / скрытие клавиатуры:

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

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

Он отлично работает в iOS 4, но проблема возникает в 3.1.3 (эту версию я могу протестировать - возможно, любую версию ниже 3.2). В версиях, предшествующих 3.2, изменение фокуса с текстового поля непосредственно на другое текстовое поле вызовет UIKeyboardWillHideNotification и UIKeyboardWillShowNotification.

Кто-нибудь знает способ выполнить некоторую анимацию, когда клавиатура действительно будет отображаться / скрываться без NSNotificationCenter?

Или как я могу преодолеть эту проблему с версиями ниже 3.2?

Благодарю.

3 ответа

Решение

Что вы можете сделать, это установить делегат текстового поля /textview для текущего контроллера представления и реализовать эти 2 метода

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    _keyboardWillHide = NO;
    return YES;
}

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    _keyboardWillHide = NO;
    return YES;    
}

После этого в вашем методе это срабатывает UIKeyboardWillHideNotification уведомление вы можете сделать что-то вроде

if (_keyboardWillHide) {
    // No other textfield/textview was selected so you can animate the tableView
    ...
}
_keyBoardWillHide = YES;

Дайте мне знать, если это работает для вас.

Вместо того, чтобы избегать уведомлений, вы можете установить NSTimer на 0,1 секунды, чтобы анимации выполнялись в одном, а в другом - отменить таймер. Таким образом, если вы одновременно получаете UIKeyboardWillHide и UIKeyboardWillShow, вы получите возможность отменить таймер Если вы не получите оба, таймер достигнет нуля, и анимация будет выполнена.

Рассмотрите возможность использования UITextFieldDelegate протокол. Метод textFieldShouldBeginEditing: сработает до уведомления и будет срабатывать при каждом входе в текстовое поле.

Другие вопросы по тегам