размер клавиатуры, заданный NSNotificationCenter

Я хочу добавить accessView на клавиатуру, вызываемую из UISearchBar. Поскольку UISearchBar не реализует это свойство, я только что создал панель инструментов. Следуя документации Apple по этому вопросу , я решил использовать центр уведомлений не только для того, чтобы знать, когда вызывается клавиатура, но и для того, чтобы знать размер клавиатуры, который меняется в зависимости от ориентации.

Я следовал примеру из документации и в методе keyboardWasShown вызываю анимацию, которая показывает панель инструментов поверх клавиатуры. Что-то вроде этого:

-(void)keyboardWasShown:(NSNotification*)aNotification {

    NSDictionary *info=[aNotification userInfo];
    CGSize keyboardSize=[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

     NSLog(@"width: %.1f; height: %.1f", keyboardSize.width, keyboardSize.height );

    [self showAccessoryView:keyboardSize.height];
}

и в анимации я установил рамку панели инструментов следующим образом:

 self.auxiliaryKeyboardBar.frame=CGRectMake(0, self.view.frame.size.height-(44+kbh), self.view.frame.size.width, 44);

где 44 — это статическая высота панели инструментов, а kbh — это значение keyboard.size.heigth, полученное из описанного выше метода.

Проблема, которую я наблюдаю, заключается в том, что размер клавиатуры, указанный в словаре userInfo, всегда относится к портретной ориентации. Итак, NSLog при портретной ориентации:

width: 320.0; heigth: 216.0, это нормально

но когда я меняю ориентацию на альбомную и вызываю клавиатуру, NSLog выглядит следующим образом:

width: 162.0; heigth: 480.0, что выводит панель инструментов из области видимости.

поэтому я добавил условное выражение перед вызовом анимации, например:

if ([self deviceIsPortrait]==YES) {
        [self showAccessoryView:keyboardSize.height];
    }else if ([self deviceIsPortrait]==NO) {
        [self showAccessoryView:keyboardSize.width];
    }

Теперь мне интересно, делаю ли я что-то не так, потому что я следую примеру Apple именно для того, чтобы избежать зависимости от высоты клавиатуры (как с плавающей запятой), и мне все равно пришлось добавить условную ориентацию.

Что тут происходит?


person Marcal    schedule 02.07.2012    source источник


Ответы (1)


Я думаю, что вам не хватает этого:

CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];

Это немного вырвано из контекста, поэтому вот полная реализация:

- (void) keyboardDidShow:(NSNotification*)notification {
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSLog(@"keyboard frame raw %@", NSStringFromCGRect(keyboardFrame));

    UIWindow *window = [[[UIApplication sharedApplication] windows]objectAtIndex:0];
    UIView *mainSubviewOfWindow = window.rootViewController.view;
    CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];
    NSLog(@"keyboard frame converted %@", NSStringFromCGRect(keyboardFrameConverted));
}
person Erik B    schedule 02.07.2012
comment
CGRect, хранящийся под ключом UIKeyboardFrameBeginUserInfoKey, находится в системе координат окна (которая всегда находится в невращаемой ориентации). - person Nick Dowell; 02.07.2012
comment
Спасибо и за ответ, и за разъяснение. Все вместе немного болит в шее. - person Marcal; 02.07.2012
comment
Кажется, это не работает для меня на 64-битных устройствах. - person korbonix; 18.11.2014