自定义Unity在iOS平台上的虚拟键盘

日本版本的玩家反馈,iOS的虚拟键盘无法点击确认按钮。观察了游戏内容如下:
发现确认按钮被长条的文本框给挤压了,不能完全显示。
于是观察了隔壁几家游戏是怎么处理虚拟键盘的,如图:
自定义Unity在iOS平台上的虚拟键盘_第1张图片
楚留香的键盘:明显重写了输入框。输入框显示在屏幕最上方,okay和cancel没有本地化
自定义Unity在iOS平台上的虚拟键盘_第2张图片
决战平安京的键盘:跟上面一样
自定义Unity在iOS平台上的虚拟键盘_第3张图片
阴阳师的键盘:没有输入框,把聊天的UI整体上移,显示出游戏内的文本框
自定义Unity在iOS平台上的虚拟键盘_第4张图片
王者荣耀的键盘:和我们的游戏一样,祝他不出问题~
自定义Unity在iOS平台上的虚拟键盘_第5张图片
PM希望我们的游戏能够像这样,如图:
自定义Unity在iOS平台上的虚拟键盘_第6张图片
因为这是iPhone或iPad上的键盘,所以出了unity开发的范畴,涉及到iOS开发的知识。
Unity导出iOS平台工程时,会做一些处理,来研究一下Unity都做了什么。我新建了一
个空Unity工程,直接导出iOS工程。发现在Classes-UI目录下有个Keyboard类,它就
是Unity对虚拟键盘的处理,如图:
自定义Unity在iOS平台上的虚拟键盘_第7张图片
继续查看Keyboard类的内容,找到UIView类型的变量editView,从名字上看是一
个编辑控件,就是这个东西。如图:
自定义Unity在iOS平台上的虚拟键盘_第8张图片
它的初始化代码如下:

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

iOS内的坐标系原点为屏幕左上角,如果把参数(y - kToolBarHeight)赋值0,它就会在屏幕最上方,跟楚留香的一样。
再接着查找UIToolbar类型的变量viewToolbar,它是一个工具条,如图:
自定义Unity在iOS平台上的虚拟键盘_第9张图片
它里面有两个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,如下:
自定义Unity在iOS平台上的虚拟键盘_第10张图片
我们游戏当时赋的值为1,为单行输入,所以multiline为false,就是一开始那张我们游戏里
的截图。现在把它赋为0,为多行输入,就满足了现在的需要。

最后总结,Unity导出iOS工程后会对虚拟键盘进行处理,我们的UILabel控件是否支持多行
输入会使虚拟键盘的样式不同。同时,也可以对Keyboard类进行修改,来设计个性化的键盘
样式。

你可能感兴趣的:(自定义Unity在iOS平台上的虚拟键盘)