1. 程式人生 > >自定義Unity在iOS平臺上的虛擬鍵盤

自定義Unity在iOS平臺上的虛擬鍵盤

日本版本的玩家反饋,iOS的虛擬鍵盤無法點選確認按鈕。觀察了遊戲內容如下:
發現確認按鈕被長條的文字框給擠壓了,不能完全顯示。
於是觀察了隔壁幾家遊戲是怎麼處理虛擬鍵盤的,如圖:
這裡寫圖片描述
楚留香的鍵盤:明顯重寫了輸入框。輸入框顯示在螢幕最上方,okay和cancel沒有本地化
這裡寫圖片描述
決戰平安京的鍵盤:跟上面一樣
這裡寫圖片描述
陰陽師的鍵盤:沒有輸入框,把聊天的UI整體上移,顯示出遊戲內的文字框
這裡寫圖片描述
王者榮耀的鍵盤:和我們的遊戲一樣,祝他不出問題~
這裡寫圖片描述
PM希望我們的遊戲能夠像這樣,如圖:
這裡寫圖片描述
因為這是iPhone或iPad上的鍵盤,所以出了unity開發的範疇,涉及到iOS開發的知識。
Unity匯出iOS平臺工程時,會做一些處理,來研究一下Unity都做了什麼。我新建了一
個空Unity工程,直接匯出iOS工程。發現在Classes-UI目錄下有個Keyboard類,它就
是Unity對虛擬鍵盤的處理,如圖:
這裡寫圖片描述


繼續檢視Keyboard類的內容,找到UIView型別的變數editView,從名字上看是一
個編輯控制元件,就是這個東西。如圖:
這裡寫圖片描述
它的初始化程式碼如下:

int height = UnityDeviceDPI() > 300 ? 75 : 100;
editView.frame = CGRectMake(0, y - kToolBarHeight, kbRect.size.width, height);

iOS內的座標系原點為螢幕左上角,如果把引數(y - kToolBarHeight)賦值0,它就會在螢幕最上方,跟楚留香的一樣。
再接著查詢UIToolbar型別的變數viewToolbar,它是一個工具條,如圖:
這裡寫圖片描述


它裡面有兩個Item,一個是doneItem,一個是cancleItem,分別對應完成和取消。
最後再找一個重要的bool型別的引數叫multiline,它判斷你的文字輸入框是否支援多行。Unity就是
通過判斷文字框是單行還是多行,來進行兩種樣式的鍵盤顯示。如果是單行,虛擬鍵盤就是我們
遊戲裡的樣式,如果是多行,就是上面這種樣式。看下程式碼:

- (void)positionInput:(CGRect)kbRect x:(float)x y:(float)y
{
    if(_multiline)
    {
        // use smaller area for iphones and
bigger one for ipads int height = UnityDeviceDPI() > 300 ? 75 : 100; editView.frame = CGRectMake(0, y - kToolBarHeight, kbRect.size.width, height); } else { CGRect statusFrame = [UIApplication sharedApplication].statusBarFrame; unsigned statusHeight = statusFrame.size.height; editView.frame = CGRectMake(0, y - kToolBarHeight - statusHeight, kbRect.size.width, kToolBarHeight); inputView.frame = CGRectMake(inputView.frame.origin.x, inputView.frame.origin.y, kbRect.size.width - 3*18 - 2*50, inputView.frame.size.height); } _area = CGRectMake(x, y, kbRect.size.width, kbRect.size.height); [self updateInputHidden]; }

而,multiline這個引數是哪裡傳過來的呢?看下程式碼發現,是通過Unity的下面這個函式傳入:

extern "C" void UnityKeyboard_Create(unsigned keyboardType, int autocorrection, int multiline, int secure, int alert, const char* text, const char* placeholder)

最後,通過實驗發現,Unity中UILabel中有個引數叫Max Lines,如下:
這裡寫圖片描述
我們遊戲當時賦的值為1,為單行輸入,所以multiline為false,就是一開始那張我們遊戲裡
的截圖。現在把它賦為0,為多行輸入,就滿足了現在的需要。

最後總結,Unity匯出iOS工程後會對虛擬鍵盤進行處理,我們的UILabel控制元件是否支援多行
輸入會使虛擬鍵盤的樣式不同。同時,也可以對Keyboard類進行修改,來設計個性化的鍵盤
樣式。