Я не знаю, если вы все еще заинтересованы в ответе, так как я вижу последнее действие здесь было год назад, но сегодня я наткнулся на точно такую же проблему в iOS 6 и решил поделиться своим решением с кем-либо еще интересно.
Я заметил, что смещение, на которое UIScrollView перемещается вверх, вдвое меньше высоты клавиатуры, но только в том случае, если содержимое UIScrollView смещено. Таким образом, мой обходной путь состоял в том, чтобы переместить UIScrollView DOWN с точно такой же величиной непосредственно перед анимацией, если смещение содержимого UIScrollView больше 0. Это прекрасно работает как на iPhone 4 (дисплей 3,5 дюйма), так и на iPhone 5 (дисплей 4 дюйма) для сейчас, но я не знаю, что произойдет, если Apple решит это исправить, если это действительно ошибка UIKit.
В любом случае, вот мой код для ясности:
- (void)keyboardWillHide:(NSNotification *)notification
{
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
if (self.scrollView.contentOffset.y > 0) {
CGRect f = CGRectMake(0, keyboardSize.height / 2, self.scrollView.frame.size.width, self.scrollView.frame.size.height);
self.scrollView.frame = f;
}
[UIView animateWithDuration:0.25 animations:^{
self.scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}];
}