我已经在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;
}
请告诉我有更好的方法。
答案 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使容器足够大,以适合其最小尺寸的儿童。
希望我明确表示,
(随意纠正我不正确的英语句子......)