自定義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類進行修改,來設計個性化的鍵盤
樣式。