Лучший способ изменить размер контейнеров в Flex так, чтобы он соответствовал ТОЛЬКО явным размерам родительских контейнеров.

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

Вот условия проблемы:

|------Container  ------------|
|  explicitHeight:  400 (or whatever)
|                             |
|  |-------- VBox  -------|   |
|  |  percentHeight: 100  |   | 
|  |                      |   |
|  |  |-Repeater------|   |   |
|  |  | Potentially   |   |   |
|  |  | a lot of stuff.   |   |
|--|--|---------------|---|---|

Проблема в том, что, вопреки тому, что я хотел бы, VBox ВСЕГДА будет расширяться для размещения содержимого внутри него, вместо того, чтобы придерживаться явной высоты своего родителя и создавать полосу прокрутки.

Мое решение заключалось в жестком кодировании ссылки на родителя (или, как бы далеко в списке отображения нам нужно было перейти, чтобы найти явно заданное значение, а не процентное значение).

Я даже подумал об использовании этого в служебном классе:

public static function getFirstExplicitHeightInDisplayList(comp:UIComponent):Number{
    if (!isNaN(comp.explicitHeight)) return comp.explicitHeight;
    if (comp.parent is UIComponent) return    
         getFirstExplicitHeightInDisplayList(UIComponent(comp.parent));
    else return 0;
}

Пожалуйста, скажи мне, что есть способ получше.


person Aaron    schedule 28.10.2008    source источник


Ответы (5)


Вы должны использовать параметр «autoLayout» в VBox, как сказано в документации:

«По умолчанию размер контейнера VBox достаточно велик, чтобы сохранить изображение в исходном размере. Если вы отключаете обновления макета и используете эффект Zoom для увеличения изображения или используете эффект Move для изменения положения изображения, изображение может выходить за границы контейнера VBox.

< i> Вы устанавливаете для свойства autoLayout значение false, поэтому размер контейнера VBox не изменяется при изменении размера изображения. Если изображение увеличивается до размера, выходящего за границы контейнера VBox, контейнер добавляет полосы прокрутки и обрезает изображение. на его границах.

Надеюсь, это вам поможет.

person netsuo    schedule 29.10.2008
comment
Оно делает! Спасибо за ответ. - person Aaron; 12.02.2009

установка minHeight = 0 - это все, что вам нужно сделать.

Это говорит VBox игнорировать его детские измерения при изменении размера и вычислять его высоту вместо этого на основе собственных / родительских ограничений. Установите все остальное, как обычно, прокрутка и все остальное будет работать отлично.

Год назад потратил на это ДНИ - это не интуитивно понятно, они, наверное, могли бы назвать собственность лучше. Надеюсь, это сэкономит вам время ...

person Community    schedule 17.12.2008
comment
Еще один случай, когда Flex не имеет смысла. Я склонен просто вести список этих вещей ... - person Aaron; 12.02.2009
comment
Я должен тебе выпить по твоему выбору, если мы когда-нибудь встретимся. - person David Ruttka; 25.09.2012

AutoLayout = false, похоже, предотвращает повторный запуск макета только при изменении размера дочерних элементов. Однако, если вы добавите или удалите дочерние элементы, макет все равно будет запущен повторно.

Установка minHeight = 0 действительно полностью отключает (внешний) размер VBox от размера и количества дочерних элементов, чего я и хотел.

Просматривая исходный код Flex, я не увидел механизма, с помощью которого установка minHeight = 0 заставляла его работать так, как я хотел, поэтому я приветствую Ярина за его обнаружение. Спасибо!

person Dave    schedule 06.01.2009

Задайте свойства вашего контейнера:

clipContent = true;
verticalScrollPolicy = "off"

Затем ваш VBox должен автоматически обрезаться, когда у него percentHeight = 100;

У меня работает во Flex 3.

Если вам нужно что-то особенное, вы можете установить scrollRect для объектов:

scrollRect = new Rectangle(x, y, w, h);

в зависимости от того, что вам нужно.

person Glenn    schedule 06.11.2008

Фактически, Ярин Кесслер дал нам здесь единственно правильный ответ (к сожалению, у меня нет прав комментировать его пост, поэтому я делаю это здесь).

Когда ваш размер HBox основан на процентном значении, вы надеетесь, что только его контейнер будет влиять на его размер. Это неправильно, есть другое правило, более сильное. Дело в том, что контейнер (которым является HBox) имеет минимальный размер, который является добавлением стандартных / явных размеров его собственных дочерних компонентов.

Итак, если ваше процентное значение приводит к значению меньше минимального размера, минимальный размер выигрывает и применяется к HBox. Поскольку HBox отображает всех своих дочерних элементов, полосы прокрутки не нужны.

Итак, используя:

minHeight = 0;
minWidth = 0;

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

Единственная фраза, которую я нашел в документации Adobe, объясняющую это:

Рекомендуется указывать размер контейнера в процентах. Flex делает контейнер достаточно большим, чтобы вместить его дочерние элементы при их минимальных размерах.

Надеюсь, я ясно дал понять,

(не стесняйтесь исправлять мои неправильные английские предложения ...)

person user1919265    schedule 12.02.2013