2012-07-02 42 views
7

Tôi muốn thêm phụ kiệnXem trên bàn phím được gọi từ UISearchBar. Vì UISearchBar không triển khai thuộc tính này, tôi vừa tạo một thanh công cụ. Theo sau Apple's documentation về vấn đề này, tôi đã quyết định sử dụng trung tâm thông báo không chỉ để biết khi nào bàn phím được gọi mà còn biết kích thước bàn phím, thay đổi tùy theo hướng.kích thước bàn phím do NSNotificationCenter cung cấp

Tôi đã làm theo ví dụ về tài liệu và, trên phương thức keyboardWasShown, tôi gọi một hoạt ảnh sẽ hiển thị thanh công cụ ở đầu bàn phím. Một cái gì đó như thế này:

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


} 

và, trên phim hoạt hình tôi đặt khung của thanh công cụ như thế này:

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

nơi 44 là heigth tĩnh của thanh công cụ và các KBH là keyboard.size .heigth được truyền từ phương thức trên.

Sự cố tôi đang quan sát là kích thước bàn phím được cung cấp bởi từ điển userInfo luôn được tham chiếu đến hướng dọc. Vì vậy, NSLog trên theo chiều dọc là:

width: 320.0; heigth: 216.0, đó là ok

nhưng khi tôi thay đổi định hướng đến cảnh quan và tôi gọi là bàn phím, các NSLog được như sau:

width: 162.0; heigth: 480.0, trong đó đặt thanh công cụ nằm ngoài phạm vi.

như vậy, tôi đã kết thúc thêm một điều kiện trước khi gọi các hình ảnh động, như thế này:

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

Tôi bây giờ tự hỏi có hay không tôi đang làm điều gì sai, vì tôi noi theo gương của Apple chính xác để tránh sự phụ thuộc vào heigth bàn phím (như là một phao) và cuối cùng tôi đã phải thêm một định hướng có điều kiện anyway.

Mọi ý tưởng về những gì đang diễn ra ở đây?

Trả lời

25

Tôi nghĩ rằng những gì bạn đang bỏ lỡ này là:

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

Đó là một chút ra khỏi bối cảnh, vì vậy đây là đầy đủ việc thực hiện:

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

Các CGRect lưu trữ dưới phím UIKeyboardFrameBeginUserInfoKey là trong hệ tọa độ cửa sổ (luôn luôn theo hướng không xoay) –

+0

Cảm ơn cả hai cho câu trả lời và làm rõ. Tất cả cùng nhau là một chút đau ở cổ. – Marcal

+0

Điều này dường như không hoạt động đối với tôi trên các thiết bị 64 bit. – korbonix

Các vấn đề liên quan