【问题标题】:Flex 4 UIComponent width and height remains zero after addChild is called调用 addChild 后,Flex 4 UIComponent 的宽度和高度保持为零
【发布时间】:2011-11-03 18:12:30
【问题描述】:

我有一个组件ObjectHolder,它扩展了UIComponent,它包含许多孩子UIComponents。但是,在使用addChild() 将这些孩子添加到ObjectHolder 之后,其宽度和高度仍然为零。 UIComponent 是否可以自动扩展到其包含的子组件的大小?

public class ObjectHolder extends UIComponent
{       
    public function ObjectHolder()
    {
        var c1:UIComponent = new UIComponent();
        c1.graphics.beginFill( 0xffffff );
        c1.graphics.drawRect(0, 0, 100, 100);
        addChild( c1 );
        trace( this.width );  // Displays zero
    }
}

【问题讨论】:

    标签: apache-flex actionscript-3 uicomponents addchild


    【解决方案1】:

    UIComponent 是否可以自动展开到大小 它包含子组件?

    正式的答案是否定的。组件从不负责设置它自己的高度和宽度值;它只负责根据该组件的父级设置的值来调整其子级的大小和位置。

    如果你在你的组件中实现了一个 measure() 方法,你可以使用它来设置你的组件的measuredWidth和measuredHeight。从本质上讲,这将是您向父母的容器提供的建议,说明您需要正确定位和调整所有子元素的大小。您自己的组件应根据传入的 unscaledWidth 和 unscaledHeight 值在 updateDisplayList() 中调整大小和定位。

    大多数情况下,Flex 默认容器将遵循这些大小值;尽管在某些情况下它们不会。例如,如果子容器需要的大小大于父容器的大小。

    【讨论】:

      【解决方案2】:

      要更改组件的大小,您应该implement measure() method。但你也应该关注其他recommendations on creating custom components。在您的情况下,您应该在 createChildren() method 中创建并添加子组件。

      【讨论】:

      • 组件永远不会自行调整大小。实现 measure() 方法仅通过 measureHeight 和 measureWidth 属性向该组件父容器提供“建议”。不过,大多数默认的 Flex 容器都会支持这些大小。
      • @PeterBZ 在这种情况下,添加一个孩子后,您应该调用invalidateSize(),它会在下一帧调用measure。
      • @www.Flextras.com 当然你是对的。但是,如果组件没有明确的大小,所有布局容器或布局都依赖于measure() 执行的测量。我想就作者提出的这个问题而言,他没有设置明确的尺寸。
      • @PeterBZ 在布局容器中布局组件时(在您的情况下,组件是ObjectHolder,容器是Grid,我想)您有几种调整大小的可能性。您可以以像素为单位设置显式宽度或高度(我的意思是将其设置在您的 ObjectHolder 之外)。您可以将其设置为百分比(percentWidthpercentHeight)。您可以设置最小和最大尺寸。所有这些价值观都在考虑为什么要布局。而measure() 是一种告诉容器组件想要的尺寸(期望尺寸)的方法。
      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 2021-11-04
      • 2011-01-22
      • 2017-06-17
      • 1970-01-01
      • 2014-01-22
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多