Как я могу исправить эту потенциальную ошибку с компонентом ComboBox во Flash? - PullRequest
1 голос
/ 06 сентября 2010

Когда я добавляю компонент ComboBox в Sprite, высота контейнера больше, чем должна.

Вот что я имею в виду:

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.

Какие-нибудь решения?

UPDATE: Я переписал метод configUI в подклассе ComboBox, но измерения все время верны. Почему высота контейнера меняется на 100?

Ответы [ 6 ]

3 голосов
/ 13 ноября 2012

Это из-за глупой имплантации Adobe компонентов Flash, если вы посмотрите во 2-й кадр компонента внутри IDEA Flash, вы увидите, что это временный аватар, возвращающий исходный размер.

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);
1 голос
/ 29 января 2011

Не думаю, что это исключительная ошибка ComboBox.

Когда я добавляю компонент Button в Sprite контейнер, я также получаю разные результаты при отслеживании кнопки и размеров контейнера.На самом деле я получаю те же 100 x 100 результаты.

Я бы отказался от возможности выпадающего списка, поскольку компонент Button не имеет такового.

Я думаю, что обходной путь будетто же самое для двухкомпонентных объектов (ComboBox и Button), но я пока не нашел решения.Будет обновляться, когда я это сделаю.

ОБНОВЛЕНИЕ:

Я только смог получить эту работу, используя validateNow(), и через несколько минут - я нашел следующую ссылку: http://forums.adobe.com/message/816912?tstart=0

По сути, ссылка дает указание поместить вызов validateNow() в событие EnterFrame или внутрь SetTimeout с надлежащей синхронизацией.

1 голос
/ 30 сентября 2010

«если он открыт, то высота С выпадающим списком»

Хм, я думаю, что когда список добавляется в displayList под кнопкой, фактически добавленный список имеет всплывающее окно. Таким образом, высота должна оставаться на высоте кнопки, поскольку спрайт никогда не будет содержать выпадающий список.

Возможная причина, по которой высота Контейнера может быть неправильной, прежде чем она пройдет какую-либо недействительность, может быть связана с дочерними элементами, которые в нем содержатся. Возможно, обложка со списком (может быть мувиклип высотой 102 пикселя) или подкомпонент со списком, который всегда начинается с высоты 102 пикселя или со странной высоты (известно, что TextField в кнопке иногда неверен).

Простым решением было бы дождаться события creationComplete / добавлено и посмотреть, какова конечная высота, а затем нарисовать границу.

0 голосов
/ 11 ноября 2010

Привет я нашел где-то решение для аналогичной проблемы с 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; 
0 голосов
/ 07 сентября 2010

вы можете настроить вручную перед этим кодом:

container.width=100;

container.height=100;

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

0 голосов
/ 06 сентября 2010

Итак, я думаю, отображаемая высота ComboBox равна фактическая высота - то есть, если она открыта, то высота с выпадающим списком, если нет, то БЕЗ,Тем не менее - элементы все еще там, хотя с .visible установлен на false , который все еще расширяет контейнер, даже если вы не можете видеть это ... Поэтому - я бы сказал, чтобы сделать:

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

Обычно это тоже можно сделать ...

...