Растущее меню с полосой прокрутки - PullRequest
0 голосов
/ 30 октября 2018

Я не хочу задавать такой общий вопрос, но я действительно застрял и очень надеюсь, что кто-то может помочь мне в этом. Вот ситуация:

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

Я хочу создать меню с переменным количеством элементов. Меню должно быть привязано к нижней части (со смещением) и расти вверх. До сих пор мне удавалось управлять этим с помощью VerticalLayoutGroup и привязки прямоугольного преобразования к основанию.

Но мое последнее требование заключается в том, что если содержимое станет слишком большим, появится полоса прокрутки. Определение слишком большого содержимого: если оно увеличит (неизвестную) высоту экрана (за вычетом смещения, конечно). Я надеюсь, что следующее изображение иллюстрирует это намного яснее:

enter image description here

У меня есть проект единства: https://ufile.io/v31br

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

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

Вы можете проверить высоту экрана с помощью свойства Screen.height.

Как только вы узнаете высоту экрана, вы можете сравнить ее с высотой прямоугольника и переключить полосу прокрутки с помощью свойства ScrollRect.vertical. Возможно, вам придется изменить ScrollRect.verticalScrollbarVisibility на permanent, чтобы он работал на вас.

0 голосов
/ 31 октября 2018

Ответ, который разместил Дейв, был близок, но проблема в том, что прокрутка не расширяется. В конце концов я исправил это, растянув представление прокрутки и изменив размер родительского элемента вручную при добавлении элементов. Я установил максимальный размер анкеров и настроил sizeDelta.

public class MenuScript : MonoBehaviour
{

    public int MenuItemCount;
    public GameObject MenuItemPrefab;
    public Transform MenuItemParent;

    private RectTransform _rectTransform;

    void Start()
    {
        _rectTransform = GetComponent<RectTransform>();

        for (var i = 0; i <= MenuItemCount; i++)
        {
            GameObject instance = Instantiate(MenuItemPrefab, MenuItemParent, false);
            instance.GetComponent<Text>().text = instance.name = "Item " + i;

            float size = instance.transform.GetComponent<RectTransform>().sizeDelta.y;
            TryExpandBy(size + 10);
        }

    }

           private void TryExpandBy(float size)
        {
            var deltaY = _rectTransform.sizeDelta.y + size;
            if (deltaY > 0) deltaY = 0;
            _rectTransform.sizeDelta = new Vector2(_rectTransform.sizeDelta.x, deltaY);
        }

}
0 голосов
/ 30 октября 2018

Вы пробовали scrollView? вот оно: https://unity3d.com/learn/tutorials/topics/user-interface-ui/scroll-view

Вы можете использовать свой вертикальный макет внутри него, и вы, вероятно, захотите отключить горизонтальную прокрутку и удалить горизонтальный ползунок.

С помощью скрипта вы можете проверить его высоту rectTransform и сравнить ее с размером вашего контейнера. Когда вы достигнете maxHeight, вы можете начать управлять размерами вашего элемента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...