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