在Flex中调整容器大小的最佳方法是仅服从父容器的显式维度

时间:2008-10-28 23:46:22

标签: flex flash layout

我已经在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 个答案:

答案 0 :(得分:13)

设置minHeight = 0就是你需要做的。

这告诉VBox在调整自身大小时忽略它的孩子的测量值,而是根据它自己/它的父母约束来计算它的高度。像往常一样设置其他所有内容,滚动,其他一切都将完美运行。

一年前在这一天度过了一天 - 这不是直观的,他们本可以更好地命名这个属性。希望这能节省你们一些时间......

答案 1 :(得分:8)

您必须在VBox上使用“autoLayout”参数,因为文档说:

“默认情况下,VBox容器的大小足以将图像保持为原始大小。如果禁用布局更新,并使用缩放效果放大图像,或使用移动效果重新定位图像,图像可能会超出VBox容器的边界。

您将autoLayout属性设置为false,因此VBox容器在图像调整大小时不会调整大小。如果图像增大到一定大小以使其超出VBox容器的边界,则容器会添加滚动条并在其边界处剪切图像。

我希望这会对你有帮助。

答案 2 :(得分:2)

AutoLayout = false似乎只会阻止在孩子的尺寸更改时重新运行布局。但是,如果添加或删除子项,则无论如何都会重新运行布局。

设置minHeight = 0确实完全断开了VBox的(外部)大小与子节点的大小和数量的关系,这就是我想要的。

通过Flex源代码,我没有看到设置minHeight = 0的机制使它像我想要的那样工作,所以我向Yarin致敬发现它。谢谢!

答案 3 :(得分:1)

设置容器的属性:

clipContent = true;
verticalScrollPolicy = "off"

然后你的VBox应该在percentHeight = 100;

时自动剪辑

在Flex 3中为我工作。

如果您需要真正喜欢,可以在对象上设置scrollRect:

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

取决于您需要它做什么。

答案 4 :(得分:0)

事实上,Yarin Kessler在这里给我们带来了唯一正确的答案 (不幸的是,我无权评论其帖子,这就是我在这里做的原因)。

当您的HBox尺寸基于百分比值时,您希望只有其容器会影响其尺寸。那是错的,还有另一个规则,一个更强大的规则。 事实上,一个容器(HBox是)具有最小的大小,这是它自己的子组件的默认/显式大小的添加。

因此,如果您的百分比值导致小于最小尺寸的值,则最小尺寸将获胜并应用于HBox。由于HBox显示其所有子节点,因此不需要滚动条。

所以使用:

minHeight = 0;
minWidth = 0;

就像告诉HBox它的最小尺寸是0而不是它的子默认尺寸。您正在重新定义它,并且最小尺寸小于百分比值并且失去战斗。

我在Adobe文档中找到的唯一一个解释这个的词是这个:

  

基于百分比的容器大小是建议性的。 Flex使容器足够大,以适合其最小尺寸的儿童。

希望我明确表示,

(随意纠正我不正确的英语句子......)