web-dev-qa-db-fra.com

Comment faire défiler jusqu'à un élément spécifique dans ScrollRect avec Unity UI?

J'ai créé un formulaire d'inscription pour un jeu mobile en utilisant Unity 5.1. Pour ce faire, j'utilise nity UI composants: ScrollRect + Autolayout (disposition verticale) + Texte (étiquettes) + Champ de saisie. Cette partie fonctionne bien.

Mais, lorsque le clavier est ouvert, le champ sélectionné se trouve sous le clavier. Existe-t-il un moyen de faire défiler le formulaire par programme pour afficher le champ sélectionné?

J'ai essayé d'utiliser ScrollRect.verticalNormalizedPosition et cela fonctionne bien pour en faire défiler, mais je ne peux pas faire apparaître le champ sélectionné où je veux.

Merci de votre aide !

14
Florent Morin

Je vais vous donner un extrait de code parce que j'ai envie d'être utile. J'espère que cela t'aides!

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

Aucune des suggestions n'a fonctionné pour moi, le code suivant ne

Voici l'extension

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

Et voici comment je l'ai utilisé pour faire défiler un enfant direct du contenu en vue

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

voici comment j'ai fixé l'objet sélectionné dans 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);
    }
}

Oui, cela est possible en utilisant le codage pour faire défiler verticalement, veuillez essayer ce code:

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

Ce code fonctionnait bien pour moi, quand j'ai développé la fonctionnalité de chat.

0
Sudhir Kotila