31

Unity 5.1 を使用してモバイル ゲームの登録フォームを作成しました。そのために、私はUnity UIコンポーネントを使用します: ScrollRect + Autolayout (垂直レイアウト) + テキスト (ラベル) + 入力フィールド。この部分は正常に動作します。

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

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

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

4

12 に答える 12

8

@ maksymiukの答えは最も正しいものですが、 InverseTransformPoint() 関数のおかげでアンカー、ピボット、その他すべてを適切に考慮しているため、それでも私にとってはそのままでは機能しませんでした-垂直スクローラーの場合、それはX 位置も変更します。そのため、垂直スクロールまたは水平スクロールが有効になっているかどうかを確認し、有効になっていない場合は軸を変更しないように変更しました。

public static void SnapTo( this ScrollRect scroller, RectTransform child )
{
    Canvas.ForceUpdateCanvases();

    var contentPos = (Vector2)scroller.transform.InverseTransformPoint( scroller.content.position );
    var childPos = (Vector2)scroller.transform.InverseTransformPoint( child.position );
    var endPos = contentPos - childPos;
    // If no horizontal scroll, then don't change contentPos.x
    if( !scroller.horizontal ) endPos.x = contentPos.x;
    // If no vertical scroll, then don't change contentPos.y
    if( !scroller.vertical ) endPos.y = contentPos.y;
    scroller.content.anchoredPosition = endPos;
}
于 2020-02-06T21:12:28.130 に答える
7

選択したオブジェクトを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);
    }
}
于 2016-05-17T15:43:35.883 に答える
0

シンプルで完璧に機能します

            var pos = 1 - ((content.rect.height / 2 - target.localPosition.y) / content.rect.height);
            scrollRect.normalizedPosition = new Vector2(0, pos);
于 2021-12-23T11:18:38.377 に答える
0

width は、スクロール rect 内の childern の幅を示します (すべての childern の幅が同じであると仮定します)。

public float getSpecificItem (float pWidth, float pSpacing,int pIndex) {
    return (pIndex * pWidth) - pWidth + ((pIndex - 1) * pSpacing);
}
于 2019-11-22T08:26:29.497 に答える