Я понимаю, что существует много подобных решений, таких как TPKeyboardAvoiding, знаменитое решение Apple и различные предложения, связанные с использованием UIScrollView. В моем случае мне нужно изменить размер представления, чтобы разместить клавиатуру, а не прокручивать или перемещать ее. Это решение ближе всего к тому, чего я пытаюсь достичь, поэтому это была моя основа. Однако у меня проблема, в которой все работает в ландшафтном режиме. Мой метод, который изменяет размер представления при появлении клавиатуры, таков:
- (void)keyboardWillShow:(NSNotification *)note {
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[self textField].superview convertRect:[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
CGRect statusBarFrame = [[self textField].superview convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil];
CGRect bounds = [self textField].superview.bounds;
CGRect newFrame = CGRectMake(0.0, 0.0, bounds.size.width, keyboardFrame.origin.y + statusBarFrame.size.height);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
[self textField].superview.frame = newFrame;
} completion:nil];
}
Это прекрасно работает в портретном режиме.
Однако в ландшафтном режиме вид изменяется влево-вправо или справа налево в зависимости от того, в каком направлении было повернуто устройство, а не снизу вверх.
Ясно, что что-то не так с тем, как я использую координаты, и какая-то система отсчета не то, что я думаю, когда она находится в ландшафтном режиме, но у меня есть время на то, как решить ее, Я попытался преобразовать всевозможные вещи с помощью -convertRect: но ничто из того, что я пытаюсь, никуда меня не доставит.
Я действительно надеюсь, что кто-то, кто меньше смущает все эти прямоугольники и как они меняются, когда изменения ориентации могут определить, что я делаю неправильно, и что мне нужно сделать, чтобы это исправить. Для справки, я создал проект, демонстрирующий простейший случай, который воспроизводит проблему, которую я имею.