如何使用Flash中的Combobox组件来修复此潜在错误?
-
01-10-2019 - |
题
当我将组合组件添加到精灵中时,容器的高度比应有的大。
这是我的意思:
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
笔记: 您将需要库中的组合组件。我正在使用Flash CS3。
如果我无效/redraw,则这样:
combo.invalidate(InvalidationType.ALL,true);
combo.drawNow();
高度从101变为104。
有解决方案吗?
更新:我已经在Combobox子类中覆盖了Configui方法,但是测量始终是正确的。为什么容器的高度更改为100?
解决方案
这是因为闪光灯的愚蠢植入闪存组件,如果您在闪存想法中的组件的第二帧中查看,您可以看到它是临时的头像,它返回初始大小。
为了解决这个问题,您应该迭代化身儿童并将其大小正常化:
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);
其他提示
“如果打开,则带有下拉框的高度”
嗯,我认为,当列表添加到按钮下方的显示列表时,其实际添加的弹出窗口。因此,高度应该保持按钮高度,因为Sprite实际上永远不会包含下拉列表。
容器高度在经历任何无效之前可能是错误的原因可能是由于所包含的孩子。也许Combobox皮肤(可能是102px高度的MovieClip)或始终以102px高度或怪异高度开始的Combobox子组件(已知按钮中的Textfield有时是错误的)。
一个简单的解决方案是等到CreationComplete/添加事件,然后查看最终高度是多少,然后绘制边框。
我不认为这是 ComboBox
独家错误。
当我添加一个组件时 Button
到 Sprite
在追踪按钮和容器尺寸时,容器我也会获得不同的结果。实际上,我收到的 100 x 100
结果。
我会丢弃下拉框的可能性,因为 Button
组件没有一个。
我认为对于两个组件对象的解决方法将相同(ComboBox
和 Button
),但我还没有找到解决方案。当我这样做时会更新。
更新:
我只是能够使用此工作 validateNow()
, ,几分钟后 - 我找到了以下链接: http://forums.adobe.com/message/816912?tstart=0
本质上,链接指示我们将 validateNow()
在内部打电话 EnterFrame
事件或内部 SetTimeout
适当的时机。
所以 - 我想显示的高度 组合框 是个 实际的 高度 - 如果打开,则带有下拉框的高度,如果没有,则没有。但是 - 这些项目仍然存在,尽管可见的设置为 错误的, ,即使您看不到它,它仍然会扩展容器,因此 - 我想说的是:
container.graphics.drawRect(0, 0, combo.width, combo.height);
这也是通常也这样做的方法...
您可以在此代码之前手动设置:
container.width=100;
container.height=100;
container.graphics.drawRect(0,0,container.width,container.height);
嗨,我在某个地方找到了用于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;