Как прокручивать элемент для scrollrect с UI единства?

Я создал форму регистрации для мобильной игры с помощью Unity 5.1. Для этого я использую Unity UI компоненты: ScrollRect + автозапуск (вертикальная компоновка) + текст (метки) + поле ввода. Эта часть отлично работает.

но, когда клавиатура открыта, выбранное поле находится под клавиатурой. Есть ли способ программно прокрутить форму,чтобы отобразить выбранное поле?

Я пробовал использовать ScrollRect.verticalNormalizedPosition и он отлично работает, чтобы прокрутить некоторые, однако я не возможность сделать выбранное поле там, где я хочу.

Спасибо за вашу помощь !

4 ответов


Я собираюсь дать вам фрагмент моего кода, потому что я чувствую, что хочу быть полезным. Надеюсь, это поможет!

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

Да, это возможно с помощью кодирования для прокрутки по вертикали, попробуйте этот код:

//Set Scrollbar Value - For Displaying last message of content
Canvas.ForceUpdateCanvases ();
verticleScrollbar.value = 0f;
Canvas.ForceUpdateCanvases ();

этот код отлично работает для меня, когда я разработал функциональность чата.


вот как я зажал выбранный объект в 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);
    }
}

ни одно из предложений не сработало для меня, следующий код сделал

вот расширение

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;
        }
    }
}

и вот как я использовал его для прокрутки прямого дочернего содержимого в view

    private void Update()
    {
        MyScrollRect.content.localPosition = MyScrollRect.GetSnapToPositionToBringChildIntoView(someChild);
    }