2012-07-02 4 views
7

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

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

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

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

    NSLog(@"width: %.1f; heigth: %.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, точно чтобы избежать зависимости от высоты клавиатуры (как float), и мне все равно пришлось добавить условное условное выражение.

Любые идеи о том, что здесь происходит?

ответ

25

Я думаю, что вы пропустили это:

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)); 
} 
+0

CGRect хранится под ключ UIKeyboardFrameBeginUserInfoKey в система координат окна (которая всегда находится в невращающейся ориентации) –

+0

Благодарим вас за ответ и пояснение. Все вместе - это немного боль в шее. – Marcal

+0

Кажется, это не работает для меня на 64-битных устройствах. – korbonix

Смежные вопросы