2013年2月14日 星期四

iOS 鍵盤處理事件

對需要切換輸入法的國家來說

處理鍵盤事件還蠻煩的..(Apple 怎麼不把這個一起搞定...)

以擁有兩個 TextField textA, TexField B textB 的 viewController 而言

在 ViewDidLoad 中註冊 UIKeyboardWillShowNotification、UIKeyboardWillHideNotification 通知後

[notification addObserver:self selector:@selector(keyboardWillShow:)

                                                 name: UIKeyboardWillShowNotification object:nil];

        [notification addObserver:self selector:@selector(keyboardWillHide:)

                                                 name: UIKeyboardWillHideNotification object:nil];

進入 text A 時,會觸發 textBigenEdit 事件

然後會觸發 UIKeyboardWillShowNotification(鍵盤顯示)

如果這時候切換鍵盤,會再次觸發 UIKeyboardWillShowNotification(鍵盤顯示)

每切換一次輸入法就會觸發一次 UIKeyboardWillShowNotification(鍵盤顯示)

在不離開 textA 的情況下直接進入 textB 的話

無論是使用程式移動或使用者移動,都不會觸發 UIKeyboardWillShowNotification(鍵盤顯示)

而無論在何種情況

關閉鍵盤就會觸發 UIKeyboardWillHideNotification(鍵盤隱藏)

所以,一個完整的解決辦法是

使用者進入、切換輸入法時,抓取鍵盤高度,進行調整

第一次進入時,抓取高度,調整元件到鍵盤上方

切換輸入法時,抓取高度,調整元件到鍵盤上方

如果元件的高度不大,可以考慮直接調整到鍵盤上方一定高度,避免切換鍵盤時移動

可是當輸入元件不只一個時,只有拉 view 的位置,很可能會因為元件間的位置不足而造成使用者混亂(UX 問題)

這邊有一個小問題

如何切換到下一個輸入欄位

使用鍵盤移動時,可以將元件放到輸入鍵盤正上方

要考慮的

元件彼此間的高度是否足夠?直接移動 view 的話,是否會造成視覺干擾?(輸入欄位 A 時,畫面上出現了欄位 A 和欄位 B,欄位 B 甚至可能讓人以為是目前正在輸入的欄位

因此在多欄位的情況,個人偏好的方法是將對應的欄位直接放到鍵盤正上方

需要的方法會是

開啟鍵盤時,移動元件或基底 view,使元件顯示到正上方

切換元件或切換輸入法時,檢查位置,移動到正上方

關閉鍵盤(離開元件時使用 resignFirstResponder)回復元件或基底 view 到原值

作法

註冊鍵盤監聽事件、beginEdit 事件

目前元件屬性

和一個接受移動或離開參數的移動方法

-(void)keyboardWillShow{

        //移動 view

}

-(void)keyboardWillHide{

        //回復 view

}

-(void)textWillEdit{

        //檢查鍵盤是否顯示,未顯示則不作動作

        //以顯示則移動 view

}

-(void)mokeView:(BOOL)toShow{

        

        //檢查鍵盤大小和元件位置,可以考慮檢查位置是否符合而是否執行移動

        //移動 view

        

}

沒有留言: