Большое вам спасибо за это; это прекрасно работает Однако представленный код имеет 2 ограничения, как я их испытал:
1) Перемещаемый вид просто выдвигается за пределы экрана, а не изменяет размер, чтобы соответствовать пространству, доступному после появления клавиатуры
2) Повторяющиеся уведомления из-за переключения текстовых полей продолжают применять изменение фрейма, в результате чего вид постепенно улетает за пределы экрана.
Причина состоит в том, что вышеупомянутое является изменением положения относительно текущего кадра представления, а не изменением размера относительно клавиатуры. Вот две исправленные строки кода, которые исправляют это:
В liftMainViewWhenKeybordAppears :, изменять размер, а не изменять положение относительно клавиатуры:
keyboardFrame = [self.view.window convertRect:keyboardFrame toView:self.view.superview];
CGRect superviewFrame = [self.view.window convertRect:self.view.superview.frame toView:self.view];
[self.view setFrame:CGRectMake(self.view.frame.origin.x,
self.view.frame.origin.y,
self.view.frame.size.width,
superviewFrame.size.height - keyboardFrame.size.height)];
В returnMainViewToInitialposition: измените анимацию на этот setFrame: (по сути, схожий с преобразованием идентичности).
[self.view setFrame:CGRectMake(self.view.frame.origin.x,
self.view.frame.origin.y,
self.view.frame.size.width,
keyboardFrame.origin.y + keyboardFrame.size.height)];