自定义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类进行修改,来设计个性化的键盘
样式。

  • 1
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值