Я работаю над приложением для iPad с помощью 3.2 sdk. Я имею дело с получением размера клавиатуры для предотвращения моих текстовых полей от hidding позади него.
Я получаю Предупреждение в XCode->, UIKeyboardBoundsUserInfoKey удерживается от использования, что я должен использовать вместо этого для не получения этого предупреждения?
Я играл с ранее предложенным решением, но все еще были проблемы. Вот что я придумал вместо этого:
- (void)keyboardWillShow:(NSNotification *)aNotification {
[self moveTextViewForKeyboard:aNotification up:YES];
}
- (void)keyboardWillHide:(NSNotification *)aNotification {
[self moveTextViewForKeyboard:aNotification up:NO];
}
- (void) moveTextViewForKeyboard:(NSNotification*)aNotification up: (BOOL) up{
NSDictionary* userInfo = [aNotification userInfo];
// Get animation info from userInfo
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
// Animate up or down
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];
CGRect newFrame = textView.frame;
CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
newFrame.origin.y -= keyboardFrame.size.height * (up? 1 : -1);
textView.frame = newFrame;
[UIView commitAnimations];
}
Из документации для UIKeyboardBoundsUserInfoKey
:
Ключ для объекта NSValue, содержащего CGRect, который определяет прямоугольник границ клавиатуры в координатах окна. Этого значения достаточно для получения размера клавиатуры. Если вы хотите получить начало клавиатуры на экране (до или после анимации), используйте значения, полученные из словаря информации о пользователе с помощью констант UIKeyboardCenterBeginUserInfoKey или UIKeyboardCenterEndUserInfoKey. Вместо этого используйте ключ UIKeyboardFrameBeginUserInfoKey или UIKeyboardFrameEndUserInfoKey.
Apple рекомендует реализовать такую удобную процедуру, как эта (которая может быть реализована как добавление категории к UIScreen
):
+ (CGRect) convertRect:(CGRect)rect toView:(UIView *)view {
UIWindow *window = [view isKindOfClass:[UIWindow class]] ? (UIWindow *) view : [view window];
return [view convertRect:[window convertRect:rect fromWindow:nil] fromView:nil];
}
для восстановления свойств размера рамки клавиатуры с поправкой на окно.
Я использовал другой подход, который включает проверку ориентации устройства:
CGRect _keyboardEndFrame;
[[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&_keyboardEndFrame];
CGFloat _keyboardHeight = ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) ? _keyboardEndFrame.size.height : _keyboardEndFrame.size.width;
@Jason, вы кодируете если нормально, кроме одного балла.
В настоящий момент вы фактически ничего не анимируете, и вид просто «выскочит» до своего нового size.height.
Вы должны указать состояние, из которого нужно анимировать. Анимация - это что-то вроде (из состояния) -> (в состояние).
К счастью, есть очень удобный способ указать текущее состояние представления как (из состояния).
[UIView setAnimationBeginsFromCurrentState:YES];
Если вы добавите эту строку сразу после beginAnimations: context: ваш код будет работать отлично.