UIKeyboardBoundsUserInfoKey удерживается от использования, что использовать вместо этого?

Я работаю над приложением для iPad с помощью 3.2 sdk. Я имею дело с получением размера клавиатуры для предотвращения моих текстовых полей от hidding позади него.

Я получаю Предупреждение в XCode->, UIKeyboardBoundsUserInfoKey удерживается от использования, что я должен использовать вместо этого для не получения этого предупреждения?

50
задан Meet Doshi 31 December 2015 в 05:08
поделиться

3 ответа

Я играл с ранее предложенным решением, но все еще были проблемы. Вот что я придумал вместо этого:

    - (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];
}
87
ответ дан 7 November 2019 в 10:31
поделиться

Из документации для 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;
57
ответ дан 7 November 2019 в 10:31
поделиться

@Jason, вы кодируете если нормально, кроме одного балла.

В настоящий момент вы фактически ничего не анимируете, и вид просто «выскочит» до своего нового size.height.

Вы должны указать состояние, из которого нужно анимировать. Анимация - это что-то вроде (из состояния) -> (в состояние).

К счастью, есть очень удобный способ указать текущее состояние представления как (из состояния).

[UIView setAnimationBeginsFromCurrentState:YES];

Если вы добавите эту строку сразу после beginAnimations: context: ваш код будет работать отлично.

1
ответ дан 7 November 2019 в 10:31
поделиться