Unity 5.1を使用して、モバイルゲームの登録フォームを作成しました。それを行うには、nity UI components:ScrollRect + Autolayout(垂直レイアウト)+ Text(ラベル)+ Input Fieldを使用します。この部分は正常に機能します。
ただし、キーボードを開くと、選択したフィールドはキーボードの下にあります。プログラムでフォームをスクロールして、選択したフィールドを表示する方法はありますか?
ScrollRect.verticalNormalizedPosition
を使用してみましたが、いくつかのスクロールには問題なく動作しますが、選択したフィールドを希望の場所に表示することはできません。
ご協力いただきありがとうございます !
私はあなたに役立つコードスニペットを提供します。お役に立てれば!
protected ScrollRect scrollRect;
protected RectTransform contentPanel;
public void SnapTo(RectTransform target)
{
Canvas.ForceUpdateCanvases();
contentPanel.anchoredPosition =
(Vector2)scrollRect.transform.InverseTransformPoint(contentPanel.position)
- (Vector2)scrollRect.transform.InverseTransformPoint(target.position);
}
提案はどれもうまくいきませんでしたが、次のコードはうまくいきました
ここに拡張子があります
using UnityEngine;
using UnityEngine.UI;
namespace BlinkTalk
{
public static class ScrollRectExtensions
{
public static Vector2 GetSnapToPositionToBringChildIntoView(this ScrollRect instance, RectTransform child)
{
Canvas.ForceUpdateCanvases();
Vector2 viewportLocalPosition = instance.viewport.localPosition;
Vector2 childLocalPosition = child.localPosition;
Vector2 result = new Vector2(
0 - (viewportLocalPosition.x + childLocalPosition.x),
0 - (viewportLocalPosition.y + childLocalPosition.y)
);
return result;
}
}
}
そして、コンテンツの直接の子を表示するためにスクロールする方法を次に示します
private void Update()
{
MyScrollRect.content.localPosition = MyScrollRect.GetSnapToPositionToBringChildIntoView(someChild);
}
選択したオブジェクトをScrollRectに固定する方法は次のとおりです。
private ScrollRect scrollRect;
private RectTransform contentPanel;
public void ScrollReposition(RectTransform obj)
{
var objPosition = (Vector2)scrollRect.transform.InverseTransformPoint(obj.position);
var scrollHeight = scrollRect.GetComponent<RectTransform>().rect.height;
var objHeight = obj.rect.height;
if (objPosition.y > scrollHeight / 2)
{
contentPanel.localPosition = new Vector2(contentPanel.localPosition.x,
contentPanel.localPosition.y - objHeight - Padding.top);
}
if (objPosition.y < -scrollHeight / 2)
{
contentPanel.localPosition = new Vector2(contentPanel.localPosition.x,
contentPanel.localPosition.y + objHeight + Padding.bottom);
}
}
はい、これはコーディングを使用して垂直にスクロールすることが可能です、このコードを試してください:
//Set Scrollbar Value - For Displaying last message of content
Canvas.ForceUpdateCanvases ();
verticleScrollbar.value = 0f;
Canvas.ForceUpdateCanvases ();
このコードは、チャット機能を開発したときにうまく機能しました。