То, что вы хотите сделать, это выяснить, где верхняя часть клавиатуры относительно представления, содержащего ваш scrollView. К счастью, в UIView есть функция с именем convertRect:fromView:
, которая берет кадр из одной системы координат и отображает его в другой системе координат. В вашем случае вы знаете рамку клавиатуры относительно основного окна, но хотели бы знать, где верхняя часть клавиатуры относительно представления, содержащего ваш scrollView. Как только вы узнаете, где верхняя часть клавиатуры пересекается с вашим видом, вы можете изменить высоту вашего scrollView в соответствии с вашими потребностями.
Ниже приведен фрагмент кода, который я использую, который я нашел где-то в Интернете и за который не берут кредит. В вашем контроллере представления вы хотите получать уведомления о событиях отображения и скрытия клавиатуры:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];
Затем реализуйте keyboardWillShow:
и keyboardWillHide:
следующим образом:
// When the keyboard shows resize self.textView to touch the top of the keyboard.
-(void)keyboardWillShow:(NSNotification *)_notification {
NSDictionary *userInfo = [_notification userInfo];
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
// Here we figure out where the keyboard overlaps with self.view
// self.view contains self.textView
CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame fromView:nil];
CGFloat textViewWidth = self.view.frame.size.width;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];
self.textView.frame = CGRectMake(0, 0, textViewWidth, keyboardFrame.origin.y);
[UIView commitAnimations];
}
// When the keyboard hides return self.textView to fullscreen
-(void)keyboardWillHide:(NSNotification *)_notification {
NSDictionary *userInfo = [_notification userInfo];
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];
self.textView.frame = self.view.frame;
[UIView commitAnimations];
}
Фрагмент содержит некоторые дополнительные материалы для анимации перехода синхронно с анимацией клавиатуры.
В этом фрагменте я использую self.textView
, который вы, вероятно, захотите изменить на self.scrollView
. Что хорошего в этом коде, так это то, что он работает во всех направлениях и на iPad. Посмотрите на код, и, надеюсь, он станет понятен.