Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android/iOS上打开键盘时自动调整ScrollView的大小_Android_Ios_Unity3d - Fatal编程技术网

在Android/iOS上打开键盘时自动调整ScrollView的大小

在Android/iOS上打开键盘时自动调整ScrollView的大小,android,ios,unity3d,Android,Ios,Unity3d,我已经看过无数关于这方面的话题,但现在我找不到任何有用的东西。我有一个肖像应用程序,它的表单主要包含输入字段 我创建了一个ScrollView,在内容中添加了所有必要的字段。我添加了垂直布局组和内容大小Fitter。现在,当我运行应用程序时,内容可以很好地移动,但当我打开键盘时,它与内容重叠,并且在编辑它们时,我看不到较低的输入字段。看起来不太好。因此,我正在寻找一个脚本/插件来为android和iOS启用此功能。我只见过iOS特定解决方案和通用解决方案,但没有一个对我有效。我可以链接我找到的所

我已经看过无数关于这方面的话题,但现在我找不到任何有用的东西。我有一个肖像应用程序,它的表单主要包含输入字段

我创建了一个ScrollView,在内容中添加了所有必要的字段。我添加了垂直布局组和内容大小Fitter。现在,当我运行应用程序时,内容可以很好地移动,但当我打开键盘时,它与内容重叠,并且在编辑它们时,我看不到较低的输入字段。看起来不太好。因此,我正在寻找一个脚本/插件来为android和iOS启用此功能。我只见过iOS特定解决方案和通用解决方案,但没有一个对我有效。我可以链接我找到的所有代码,但我认为这只会造成不必要的混乱。这些主题大部分都很老,以前可能有用,但现在不行了

理想情况下,我更喜欢一个全局解决方案,当键盘打开时,它会缩小整个应用程序,当键盘关闭时,它会重新展开

顺便说一句,我使用的是Unity 2019.2.15f1,如果有必要的话,我使用的是Android 10的像素3XL

编辑:

我创建了一个小型演示项目,您可以在其中测试键盘大小的脚本:

它包含3个脚本: ScrollContent.cs—它以编程方式将InputH.cs脚本附加到每个输入字段。 InputH.cs-它通过从KeyboardSize脚本调用OpenKeyboard/CloseKeyboard来处理编辑单个输入字段的开始(OnPointerClick)和结束(onededit)。 KeyboardSize.cs-来自@Remy_rm的脚本,稍作修改(添加了一些日志、IsKeyboardOpened方法和我的调整键盘滚动位置的尝试)

这个想法看起来不错,但问题很少:

1) “添加的”高度似乎起作用,但是滚动内容也应该被移动(我试图解决这一问题的方法在GetKeyboard height方法的最后一行,但它不起作用)。如果您滚动到底部输入字段并点击它,在键盘打开后,该字段应正好位于其上方

2) 当我第二次点击另一个输入字段时,当第一个字段被编辑时,它会导致调用OnEndIt并关闭键盘

布局层次结构如下所示:
假设您使用的是本机
触摸屏主板

您可以添加一个图像作为垂直布局组(我们称之为“缓冲区”)的最后一个条目,其alpha设置为0(使其不可见),高度设置为0。这将使布局组保持不变

然后,当您打开键盘时,您将此“缓冲区”图像的高度设置为键盘的高度。由于内容大小调整器和垂直布局组,表单的输入字段将被推到键盘上方,而键盘的“后面”将是空图像

在iOS
TouchScreenKeyboard.area.height
上,获取键盘高度很容易。但是在Android上,它返回一个空的rect。答案解释了如何获得Android键盘的高度

完全实现这一点看起来像这样(仅在Android上进行了测试,但也适用于iOS)。注意,我使用前面链接答案中的方法来获取Android键盘高度

使用系统集合;
使用UnityEngine;
使用UnityEngine.UI;
公共类键盘大小:MonoBehavior
{
[SerializeField]私有图像;
私人浮动高度=-1;
/// 
///打开键盘并启动一个获取键盘高度的协同程序
/// 
公共void OpenKeyboard()
{
触摸屏键盘。打开(“”);
start例程(GetKeyboardHeight());
}
/// 
///当键盘关闭时,将“缓冲区”图像的高度设置回零,以便内容大小调整器缩小到其原始大小
/// 
公用键盘()
{
bufferImage.GetComponent().sizeDelta=Vector2.0;
}
/// 
///根据平台获取键盘的高度
/// 
公共IEnumerator GetKeyboardHeight()
{
//等待半秒钟以确保键盘完全打开
收益率返回新的WaitForSeconds(0.5f);
#如果统一
//在iOS上,我们可以使用本机TouchScreenKeyboard.area.height
高度=触摸屏键盘面积高度;
#艾利夫·尤尼安卓
//在Android TouchScreenKeyboard.area.height上返回0,因此我们从AndroidJavaObject获取它。
使用(AndroidJavaClass UnityClass=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”))
{

AndroidJavaObject View=UnityClass.GetStatic

查看我的编辑…我查看了您的演示项目。您的scrollRect没有滚动到所选输入字段的原因是您试图设置
scrollRect.content.anchoredPosition
。您需要设置它向下滚动的是
scrollRect.verticalNormalizedPosition
这需要一个介于0和1之间的值来设置滚动量。我已经更新了答案以反映这一点。我尝试这样计算:float newVerticalNormalizedPosition=(scrollVerticalPos+keyboardHeight)/newContentHeight;但它似乎不起作用。@Makalele我已编辑了我的答案,以包含一个计算标准化位置的方法,该方法将在选择inputfield时将所选输入滚动到键盘上方。它可能需要一些偏移量调整,但应该起作用。请注意,我还在
输入中进行了一个小的编辑脚本并更改了内容游戏对象上的锚。如果需要,我可以上载演示项目的我的版本。一些值,如
newContentHeight
,需要反转,因为您的输入字段位于负Y位置。它几乎可以工作。我假设contentParent是scrollRect.Content。当我单击最后一个输入字段时ld它的滚动在它的中心,所以下半部分被截断。你能上传你的演示项目版本吗?这里是