Лучший способ определения размеров контейнеров во Flex, чтобы подчиняться ТОЛЬКО явным измерениям родительских контейнеров - PullRequest
7 голосов
/ 29 октября 2008

Я сталкивался с этой проблемой в 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;
}

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

Ответы [ 5 ]

13 голосов
/ 17 декабря 2008

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

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

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

8 голосов
/ 29 октября 2008

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

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

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

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

2 голосов
/ 06 января 2009

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

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

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

1 голос
/ 06 ноября 2008

Установите свойства вашего Контейнера:

clipContent = true;
verticalScrollPolicy = "off"

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

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

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

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

в зависимости от того, что вам нужно сделать.

0 голосов
/ 12 февраля 2013

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

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

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

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

minHeight = 0;
minWidth = 0;

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

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

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

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

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

...