Как исправить эту потенциальную ошибку с компонентом ComboBox во Flash?
Когда я добавляю компонент 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.
Какие-либо решения?
ОБНОВЛЕНИЕ: я переписал метод configUI в подклассе ComboBox, но измерения все время верны. Почему высота контейнера меняется на 100?
6 ответов
Это из-за глупой имплантации Adobe компонентов Flash, если вы посмотрите во 2-й кадр компонента внутри IDEA Flash, вы увидите его временный аватар, который возвращает первоначальный размер.
Чтобы решить эту проблему, вы должны перебрать детей аватара и нормализовать их размер:
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);
Я не думаю, что это ComboBox
эксклюзивная ошибка
Когда я добавляю компонент Button
к Sprite
Контейнер Я также получаю разные результаты при отслеживании кнопки и размеров контейнера. На самом деле, я получаю то же самое 100 x 100
Результаты.
Я бы отказался от возможности выпадающего списка, так как Button
Компонент не имеет.
Я думаю, что обходной путь будет одинаковым для двух компонентов компонентов (ComboBox
а также Button
), но я пока не нашел решения. Буду обновлять, когда я сделаю.
ОБНОВИТЬ:
Я просто смог заставить это работать, используя validateNow()
и через несколько минут - я нашел следующую ссылку: http://forums.adobe.com/message/816912?tstart=0
По сути, ссылка дает нам указание поставить validateNow()
позвонить внутрь EnterFrame
событие или внутри SetTimeout
с надлежащим временем.
"если он открыт, то высота СО выпадающего списка"
Хм, я думаю, что когда список добавляется в displayList под кнопкой, фактически добавленный список имеет всплывающее окно. Таким образом, высота должна оставаться на высоте кнопки, поскольку спрайт никогда не будет содержать выпадающий список.
Возможная причина, по которой высота контейнера может быть неправильной до того, как он прошел через какую-либо недействительность, может быть связана с дочерними элементами, которые он содержит. Возможно, обложка со списком (может быть мувиклип высотой 102 пикселя) или подкомпонент со списком, который всегда начинается с высоты 102 пикселя или со странной высоты (известно, что TextField в кнопке иногда неверен).
Простым решением было бы дождаться события creationComplete/ Added и посмотреть, какова будет конечная высота, а затем нарисовать границу.
Итак, я думаю, отображаемая высота ComboBox - это фактическая высота, то есть, если она открыта, то высота С выпадающего списка, если нет, то БЕЗ. Тем не менее - элементы все еще там, хотя с.visible установлен на false, что все еще расширяет контейнер, даже если вы не можете видеть это... Поэтому - я бы сказал, чтобы сделать:
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;