OK. Поэтому, глядя на мой старый код, я вспомнил, что я не знаю использовать 2 наблюдателя (UIKeyboardDidShowNotification
/UIKeyboardDidHideNotification
). Я использую одного наблюдателя (UIKeyboardWillChangeFrameNotification
), который запускается из каждого события: скрытие клавиатуры, отображение клавиатуры, смена клавиатуры.
В моем случае, текстовое поле и кнопка посыла в вложен в UIView
и это вид добавляется в view
в UIViewController
, выше всего остального.
Я добавляю наблюдателя в viewDidAppear
и удаляю наблюдателя в viewWillDisappear
. (Во избежание срабатывания уведомления, когда просмотр неактивен).
Вышеприведенная информация не требуется для вашего случая, просто добавьте ее для информации. Соответствующий код выглядит следующим образом:
ADD НАБЛЮДАТЕЛЕМ:
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
HANDLE УВЕДОМЛЕНИЕ:
- (void) keyboardWillChangeFrame:(NSNotification*)notification {
NSDictionary* notificationInfo = [notification userInfo];
CGRect keyboardFrame = [[notificationInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
[UIView animateWithDuration:[[notificationInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]
delay:0
options:[[notificationInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]
animations:^{
CGRect frame = self.textViewContainer.frame;
frame.origin.y = keyboardFrame.origin.y - frame.size.height;
self.textViewContainer.frame = frame;
} completion:nil];
}
Вы, возможно, придется сделать несколько корректировок в frame.origin.y...
линии для правильных расчетов. Я не знаю, есть ли у вас UITabBarController
или любые бары внизу. Безопасная ставка здесь будет:
frame.origin.y = self.view.frame.size.height - keyboardFrame.size.height - X;
Где X
является 0, если ваш VC охватывает весь экран. Если нет, используйте высоты любых нижних баров.
Проверка 'UIKeyboardWillChangeFrameNotification' /' UIKeyboardDidChangeFrameNotification'.Они запускаются каждый раз, когда меняется рамка клавиатуры, независимо от того, скрыта ли клавиатура или нет. Например, изменение типов клавиатуры (ascii/emoji) или переключение интеллектуального текстового столбца над клавиатурой. – n00bProgrammer
нерабочий .... – Albert
OK. Позвольте мне обновить Xcode и симуляторы, и я дам вам оптимизированное рабочее решение. Дайте мне час или около того. – n00bProgrammer