Как прокручивать элемент для 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);
}