2008-10-01 85 views
93

在幾種情況下,我想將一個工具欄添加到iPhone鍵盤的頂部(例如,在iPhone Safari中瀏覽表單元素時)。以編程方式在iPhone鍵盤上對齊工具欄

目前,我正在用常量指定工具欄的矩形,但因爲界面的其他元素處於通量狀態 - 工具欄和導航欄位於屏幕的頂部 - 每當我們進行次要界面更改時,工具欄都不對齊。

是否有編程方式確定鍵盤相對於當前視圖的位置?

回答

142

截至iOS 3。2有達到這種效果的新方法:

UITextFieldsUITextViewsinputAccessoryView屬性,它可以設置爲任何觀點,即自動上面顯示與鍵盤動畫。

請注意,您使用的視圖既不應位於其他位置的視圖層次結構中,也不應將其添加到某個超級視圖中,這是爲您完成的。

-4

有沒有辦法(AFAIK)獲得鍵盤視圖的尺寸。不過,至少在目前的每個iPhone版本中都是如此。

如果將工具欄位置計算爲距視圖底部的偏移量,並考慮視圖大小,則不必擔心導航欄是否存在。

例如

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size 
#define TOOLBAR_HEIGHT 30 

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT; 

// move toolbar either directly or with an animation 

相反的定義,你可以很容易地創建一個keyboardHeight函數,返回基於是否正在顯示的鍵盤大小,並移動此工具欄定位到一個單獨的函數,重組佈局。

此外,它可以取決於你在哪裏做這個定位,因爲你的視圖的大小可能會根據你的導航欄設置加載和顯示之間變化。我相信做這件事的最好的地方將會在眼前展開。

+0

這個工作很好,謝謝! 到目前爲止,我一直在由UIKeyboardDidShowNotification觸發的選擇器中進行這種計算。我只在幾個地方進行過測試,但它看起來很不錯。 – 2008-10-01 18:00:10

+0

是的,你可以得到的大小 - 完全錯誤!見下面答案 – 2009-05-15 01:47:03

+0

從5.0開始,鍵盤尺寸不再是靜態的。 – 2011-10-24 16:37:50

24

如果您註冊鍵盤的通知,即UIKeyboardWillShowNotificationUIKeyboardWillHideNotification等,您會收到包含在userInfo字典(UIKeyboardBoundsUserInfoKey)鍵盤的界限的通知。

請參閱UIWindow類參考。

72

所以基本上:

在init方法:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; 
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; 

,然後有方法上面提到的調節杆的位置:

-(void) keyboardWillShow:(NSNotification *) note 
{ 
    CGRect r = bar.frame, t; 
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t]; 
    r.origin.y -= t.size.height; 
    bar.frame = r; 
} 

可以通過讓它非常通過將位置變化包裹在動畫中來改變位置

[UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
//... 
    [UIView commitAnimations]; 
+0

今天早上正在探討我的舊東西,並注意到這是一個更好,最全面的答案。謝謝! – 2009-07-12 14:18:25

+0

這個答案在一年後仍然非常有用。在開發與此相關的東西時,它幫助我克服了駝峯。 – 2010-02-05 02:18:34

16

在3.0及更高版本中,您可以從userInfo通知字典中獲取動畫持續時間和曲線。

例如,以動畫視圖的大小,以使房間的鍵盤,報名參加UIKeyboardWillShowNotification並做類似如下:

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; 
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 

    CGRect frame = self.view.frame; 
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height; 
    self.view.frame = frame; 

    [UIView commitAnimations]; 
} 

做類似的動畫UIKeyboardWillHideNotification

60

這是基於existing answer from tonklon - 我只是添加的代碼片段顯示在鍵盤上方的半透明黑色工具欄,再加上正確的「完成」按鈕:

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease]; 
[toolbar setBarStyle:UIBarStyleBlackTranslucent]; 
[toolbar sizeToFit]; 

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)]; 

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil]; 

[flexButton release]; 
[doneButton release]; 
[toolbar setItems:itemsArray]; 

[aTextField setInputAccessoryView:toolbar]; 

-resignKeyboard看起來像:

-(void)resignKeyboard { 
    [aTextField resignFirstResponder]; 
} 

希望可以幫助別人。

0

創建此方法,並調用它ViewWillLoad:

 - (void) keyboardToolbarSetup 
{ 
    if(self.keyboardToolbar==nil) 
     { 
     self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; 

     UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)]; 

     UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

     UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)]; 


     NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil]; 

     [self.keyboardToolbar setItems:toolbarButtons]; 

     self.myTextView.inputAccessoryView=self.keyboardToolbar; 
     } 
}