2010-09-06 67 views
1

当我将一个ComboBox组件添加到Sprite中时,容器的高度比它应该大。如何在Flash中修复ComboBox组件的潜在错误?

这里就是我的意思是:

import fl.controls.ComboBox; 
//add combo box inside a container sprite 
var combo:ComboBox = new ComboBox(); 
var container:Sprite = new Sprite(); 
addChild(container); 
container.addChild(combo); 
//draw the outline of the container sprite 
container.graphics.lineStyle(1,0x009900); 
container.graphics.drawRect(0,0,container.width,container.height); 
//I don't get this: 
trace(combo.height);//outputs 22 
trace(container.height);//outputs 101 

注:您需要在您的库中的ComboBox组件。我正在使用Flash CS3。

如果我无效/重绘,这样的:

combo.invalidate(InvalidationType.ALL,true); 
combo.drawNow(); 

高度从101变为104

任何解决方案?

更新: 我覆盖了ComboBox子类中的configUI方法,但测量结果始终正确。为什么容器高度变为100?

回答

3

这是因为Adobe愚蠢地植入了Flash组件,所以如果您在Flash IDEA中查看组件的第二帧,则可以看到它是暂时的头像,它会返回初始大小。

enter image description here

解决这个你应该遍历化身儿童和规范自己的尺寸:

public static function normalizedComponent(component:Sprite):void { 
    for (var i:int = 0; i < component.numChildren; i++) { 
     component.getChildAt(i).height = component.height; 
     component.getChildAt(i).width = component.width; 
    } 
} 

用法:

var comboBox:ComboBox = new ComboBox(); 
normalizedComponent(comboBox); 
normalizedComponent(comboBox.textField); 
+0

这听起来相当准确(+1)。我稍后会放弃,谢谢你! – 2012-11-13 17:50:33

+0

当然,我只是遇到了同样的问题,碰到了你的问题,一旦我解决了它,我想分享知识;) – 2012-11-14 08:05:45

+0

测试,它的工作!好一个 :) – 2012-11-14 20:45:24

0

所以 - 我想组合框的显示高度为实际高度 - ID EST,如果它被打开,那么高度随着下拉框中,如果不是那么无。然而 - 项目仍然会存在,虽然。可见设置为,仍然扩大了容器,即使你看不到。所以 - 我要说的事:

container.graphics.drawRect(0, 0, combo.width, combo.height); 

这是平时做得一样好方式......

+0

感谢您的输入。我试图把一个简单的GUI放在一起。我想使用精灵来对齐它们中的组件(垂直或水平)。在我的例子中说'容器'将包含水平对齐的组件。如果我要添加另一个容器,请将容器设置为container2.y = container1.y + container.height,对不对?由于容器给我的测量结果不正确,因此垂直对齐容器会失败。关于下拉列表,不太确定你是对的。如果我将rowCount设置为2,那不会改变任何东西,并且默认情况下(关闭)它不会被添加 – 2010-09-06 15:36:37

+0

Still - 这是一种错误...也许.visible = false下拉是默认情况下(初始化之前)设置为某个值,并且在......之后将其更改为正确的大小......但不确定 - 错误,故障 - 这些烦人的事情很难“反向工程”,或者甚至远程理解,如果您没有源代码和/或无法正确调试它。 – 2010-09-06 18:39:11

+0

它看起来像一个错误。该源可用(例如/ Applications/Adob​​e \ Flash \ CS3/Configuration/Component \ Source/ActionScript \ 3.0/User \ Interface)。一个修复将是惊人的,但我所期望的真的是一个解决方法。 – 2010-09-06 18:43:09

0

可以在安装此代码之前手动:

container.width=100;

container.height=100;

container.graphics.drawRect(0,0,container.width,container.height);

+0

不是真的:(如果我在添加组合后设置高度,组合将缩小。如果我设置高度,之前,虽然没有任何添加到容器中,但在添加组合后,它会变为0 – 2010-09-07 15:07:55

+0

请解释,你真正的目标是什么? – Eugene 2010-09-07 15:22:09

+1

我想用一些组合框,文本输入等简单的GUI。我开始向舞台添加组件,但是出现了问题,所以我决定从代码中绘制GUI。我只是嵌套Sprites,并尝试调整它们以获得HBox/VBox类型的行为。目前,由于ComboBox的问题,这些措施出现问题。 – 2010-09-13 11:28:31

1

“如果它被打开,然后使用下拉框的高度”

嗯,我觉得当列表被添加到显示列表下面的按钮,它的实际添加了一个弹出窗口。所以高度应该保持为按钮高度,因为精灵永远不会包含下拉列表。

容器高度在经过任何失效之前可能是错误的一个可能的原因可能是由于它包含的子项。也许组合框皮肤(可能是102px高度的movieClip)或始终以102px高度或奇怪高度开始的组合框子组件(已知某个按钮中的TextField有时是错误的)。

一个简单的解决方案是等待creationComplete/added事件,看看最终的高度是多少,然后绘制边界。

+0

我已经看过组件皮肤:列表组件是100x100,我将子组件ComboBox和“overri” den'configUI方法,我已经将高度设置为22(setSize)。如果我在由组合框触发的Event.ADDED的事件处理程序中绘制边框,则边框仍然看起来不正确。我添加了一个超时,但是这个时间为335毫秒,似乎有效,但它是一个解决方案。 – 2010-09-30 13:21:30

+0

看看validateNow()方法http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/controls/ComboBox.html#methodSummary – 2010-09-30 14:17:18

+0

尝试过validateNow(),drawNow()没有太多的运气:( – 2010-09-30 15:08:43

0

嗨,我发现某处NumericStepper类似的问题的解决方案。

和解决方案是:

var tInput:TextInput = numericStepper.getChildAt(2) as TextInput; 
tInput.textField.height = 22; 

在你的情况下,尝试以下操作:

var tInput:TextInput = combo.getChildAt(1) as TextInput; 
tInput.textField.height = 22; 
+1

Hi @Sanjay。我很害怕我没有完全理解这个链接,所以你访问NumbericStepper组件中的TextInput,并明确地将高度设置为22?我会给出一个与我的问题一起去看看如何 – 2010-11-11 10:05:19

1

我不认为这是一个ComboBox独家错误。

当我将一个组件Button添加到一个Sprite容器时,跟踪按钮和容器尺寸时我也会得到不同的结果。其实,我收到相同的100 x 100结果。

我会放弃下拉框的可能性,因为Button组件没有。

我认为解决方案对于2个组件对象(ComboBoxButton)是相同的,但我还没有找到解决方案。我会做更新。

UPDATE:

我只是以后能够得到使用validateNow()这方面的工作,并在几分钟 - 我发现下面的链接:http://forums.adobe.com/message/816912?tstart=0

从本质上讲,链接指示我们把validateNow()EnterFrame事件内或在SetTimeout内调用适当的时间。

+0

有一件事对我来说是一个肮脏的小黑客:我使用了一个Timer/setTimeout,并在大约650毫秒后开始使用测量,这是正确的。我试图减少这个数字,但它变得不稳定。也需要在该区域初始化的代码/图形数量也会影响重绘所需的时间。再次,这是一个肮脏的黑客攻击。我希望有一个干净的解决方案,我可以标记/投票/等。 – 2011-01-29 20:15:38

+0

当我在e时回答在帖子旁边。但是,谢谢你!正如我之前告诉过的那样,validateNow()本身就完成了这项工作。 ;-)星期六晚上的编码器? – 2011-01-29 20:26:16

相关问题