2012-07-02 8 views
7

Chcę dodać accessoryView na klawiaturze wywoływanej z paska UISearchBar. Ponieważ program UISearchBar nie implementuje tej właściwości, właśnie utworzyłem pasek narzędzi. Po tym, jak podjąłem w sprawie Apple's documentation, zdecydowałem się użyć centrum powiadomień nie tylko do poznania, kiedy klawiatura jest wywoływana, ale także do poznania wielkości klawiatury, która zmienia się w zależności od orientacji.rozmiar klawiatury podany przez NSNotificationCenter

Podążyłem za przykładem w dokumentacji i na metodzie keyboardWasShown wywołuję animację, która pokaże pasek narzędzi na klawiaturze. Coś takiego:

-(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]; 


} 

, a na animacji ustawić ramkę pasku takiego:

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

gdzie 44 jest statyczna heigth paska narzędzi i kbh jest keyboard.size .thigth przeszedłem z powyższej metody.

Problem, który obserwuję, polega na tym, że rozmiar klawiatury podawany przez Słownik userInfo zawsze odnosi się do orientacji pionowej. Tak, NSLog o orientacji pionowej jest:

width: 320.0; heigth: 216.0, który jest ok

ale kiedy zmienić orientację na poziomą i nazywam klawiatury, NSLog się następująco:

width: 162.0; heigth: 480.0, co stawia pasek narzędzi poza zakresem.

tak, skończyło się dodając warunkowego przed wywołaniem animacji, takich jak ten:

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

Jestem teraz zastanawiasz się, czy robię coś źle, bo ja po przykład Apple precyzyjnie aby uniknąć zależności od wysokości klawiatury (jako zmiennoprzecinkowej) i ostatecznie musiałem dodać warunkową wartość warunkową.

Jakieś pomysły na to, co się tutaj dzieje?

Odpowiedz

25

myślę co tracisz to:

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

To trochę wyrwane z kontekstu, więc tutaj jest pełna realizacja:

- (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 przechowywane w kluczu UIKeyboardFrameBeginUserInfoKey jest w układ współrzędnych okna (który zawsze jest w orientacji nieobrotowej) –

+0

Dziękuję obojgu za odpowiedź i wyjaśnienie. Wszystko razem to trochę ból w szyi. – Marcal

+0

To wydaje się nie działać dla mnie na 64-bitowych urządzeniach. – korbonix

Powiązane problemy