web-dev-qa-db-ja.com

Unity UIでScrollRectの特定の要素にスクロールする方法は?

Unity 5.1を使用して、モバイルゲームの登録フォームを作成しました。それを行うには、nity UI components:ScrollRect + Autolayout(垂直レイアウト)+ Text(ラベル)+ Input Fieldを使用します。この部分は正常に機能します。

ただし、キーボードを開くと、選択したフィールドはキーボードの下にあります。プログラムでフォームをスクロールして、選択したフィールドを表示する方法はありますか?

ScrollRect.verticalNormalizedPositionを使用してみましたが、いくつかのスクロールには問題なく動作しますが、選択したフィールドを希望の場所に表示することはできません。

ご協力いただきありがとうございます !

14
Florent Morin

私はあなたに役立つコードスニペットを提供します。お役に立てれば!

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);
    }
32
maksymiuk

提案はどれもうまくいきませんでしたが、次のコードはうまくいきました

ここに拡張子があります

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);
    }
6
Peter Morris

選択したオブジェクトを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 ();

このコードは、チャット機能を開発したときにうまく機能しました。

0
Sudhir Kotila