2012-11-24 57 views
0

我需要有人向我解釋這一點,因爲它沒有任何意義。UIKeyboard的框架是20像素關

當從userInfo使用UIKeyboardFrameEndUserInfoKey獲取UIKeyboards幀並進行數學運算以使視圖看起來堆疊在鍵盤上時,我需要改變20個像素的差異。

數學:

CGRect frame = view.frame; 
CGPoint origin = frame.origin; 
origin.x = kbFrame.origin.x; 
origin.y = kbFrame.origin.y - view.frame.size.height - 20; 
frame.origin = origin; 
view.frame = frame; 

我想這一定是狀態欄,但這裏的踢球,我正在開發一個視網膜顯示器,因此在狀態欄的高度爲40個像素不是20

我然後加入一個從視圖中轉換,以查看

CGRect kbFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

UIWindow * window = [UIApplication sharedApplication].windows[0]; 

kbFrame = [self.view convertRect:kbFrame fromView:window]; 

這似乎固定它;那就是我可以去掉20個像素的差異。

真正引起我的是,當使用UIKeyboardFrameBeginUserInfoKey時,鍵盤的框架位於屏幕的底部,這是正確的,但最終框架導致我編碼20個像素的差異。當我添加轉換代碼時,它將鍵盤放置20個像素,從而消除差異。這到底是怎麼回事?

回答

1

你所描述的是自然和想要的行爲。
事情是鍵盤座標是在窗口座標系統中。
您的觀點可能不在窗口座標系統中。所以你總是需要在座標系之間進行轉換才能正確使用它。

什麼用UIKeyboardFrameBeginUserInfoKey時真的拋出我的是,鍵盤的框架是在屏幕上,這是正確的底部,

我會不同意,你可能比你想象的要低20點你是(如果你將它設置在你的視圖座標系中),但是因爲它不在屏幕上,所以你不會注意到偏移量。

每個視圖都有自己的座標系在它的範圍內。並且視圖的框架在其父座標系中表示。如果我們不瞭解這種差異的原因和必要性,那麼也會導致一些混淆。

我希望這會幫助你。

注意的視網膜顯示和測量:
在iOS上你永遠不會在你的代碼的像素處理(準備你的資產只有當)你總是處理點。所以狀態欄總是20點,在視網膜上或沒有。