Если вы посмотрите на measure
метод mx.controls.ComboBase
, вы увидите, что comboBox вычисляет его measuredMinWidth
как сумму ширины текста и ширины кнопки comboBox.
// Text fields have 4 pixels of white space added to each side
// by the player, so fudge this amount.
// If we don't have any data, measure a single space char for defaults
if (collection && collection.length > 0)
{
var prefSize:Object = calculatePreferredSizeFromData(collection.length);
var bm:EdgeMetrics = borderMetrics;
var textWidth:Number = prefSize.width + bm.left + bm.right + 8;
var textHeight:Number = prefSize.height + bm.top + bm.bottom
+ UITextField.TEXT_HEIGHT_PADDING;
measuredMinWidth = measuredWidth = textWidth + buttonWidth;
measuredMinHeight = measuredHeight = Math.max(textHeight, buttonHeight);
}
Метод calculatePreferredSizeFromData
, упомянутый @defmeta (реализован в mx.controls.ComboBox
), предполагает, что средство визуализации данных является просто текстовым полем, и использует flash.text.lineMetrics
для вычисления ширины текста из поля метки в объекте data
. Если вы хотите добавить дополнительный визуальный элемент к средству визуализации элементов и иметь ComboBox
, учитывающий его размер при расчете его собственного размера, вам придется расширить класс mx.controls.ComboBox
и переопределить метод calculatePreferredSizeFromData
следующим образом:
override protected function calculatePreferredSizeFromData(count:int):Object
{
var prefSize:Object = super.calculatePrefferedSizeFromData(count);
var maxW:Number = 0;
var maxH:Number = 0;
var bookmark:CursorBookmark = iterator ? iterator.bookmark : null;
var more:Boolean = iterator != null;
for ( var i:int = 0 ; i < count ; i++)
{
var data:Object;
if (more) data = iterator ? iterator.current : null;
else data = null;
if(data)
{
var imgH:Number;
var imgW:Number;
//calculate the image height and width using the data object here
maxH = Math.max(maxH, prefSize.height + imgH);
maxW = Math.max(maxW, prefSize.width + imgW);
}
if(iterator) iterator.moveNext();
}
if(iterator) iterator.seek(bookmark, 0);
return {width: maxW, height: maxH};
}
Если возможно, сохраните размеры изображения в объекте данных и используйте эти значения как imgH
и imgW
, что значительно облегчит определение размера.
РЕДАКТИРОВАТЬ:
Если вы добавляете к элементу рендеринга помимо изображения, например метки, вам также придется вычислять их размер при выполнении итерации по элементам данных и учитывать эти измерения при расчете maxH
и * 1024. *.