Comment puis-je corriger ce bogue potentiel avec la zone de liste déroulante des composants dans Flash?

StackOverflow https://stackoverflow.com/questions/3652470

Question

Quand j'ajoute un composant ComboBox dans un Sprite, la hauteur du conteneur est plus grand que prévu.

Voici ce que je veux dire:

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

Note: Vous aurez besoin du composant ComboBox dans votre bibliothèque. J'utilise Flash CS3 pour cela.

Si je invalidate / redessiner, comme ceci:

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

les changements de hauteur de 101 à 104.

Les solutions?

Mise à jour: Je l'ai écrasé à la méthode configui dans une sous-classe ComboBox, mais les mesures sont correctes tout le temps. Pourquoi le changement de hauteur du récipient à 100?

Était-ce utile?

La solution

Ceci est dû à l'implantation d'Adobe stupide de composants Flash, si vous regardez dans le 2ème cadre d'un composant à l'intérieur une idée Flash, vous pouvez le voir Avatar temporaire qui renvoie la taille initiale.

entrer image description ici

pour résoudre cela, vous devez itérer sur les enfants avatar et de normaliser leur taille:

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;
    }
}

utilisation:

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

Autres conseils

« si elle est ouverte, alors la hauteur avec le menu déroulant »

Hmm, je pense que lorsque la liste est ajouté à la liste DisplayList sous le bouton est en fait ajouté a une fenêtre contextuelle. Ainsi, la hauteur est censé rester la hauteur du bouton, car l'image-objet ne contient en fait la liste déroulante.

Une raison possible la hauteur des conteneurs pourrait être mal avant qu'il ne passe par aucune infirmation pourrait être due aux enfants qu'il contient. Peut-être la peau combobox (pourrait être un movieClip de 102px hauteur) ou d'un sous-composant ComboBox qui commence toujours à la hauteur 102px ou avec une hauteur bizarre (TextField dans un bouton est connu pour être parfois mal).

Une solution simple serait d'attendre un événement creationComplete / ajoutée et voir quelle est la hauteur finale, puis tracer la frontière.

Je ne pense pas que ce un bug ComboBox exclusif.

Lorsque j'ajoute un Button composant à un conteneur de Sprite Je reçois aussi des résultats différents lors du traçage sur le bouton et les dimensions du récipient. En fait, je reçois les mêmes résultats de 100 x 100.

J'écarterait la liste déroulante possibilité boîte, puisque le composant Button ne possède pas.

Je pense que la solution serait de même pour les objets 2 composants (ComboBox et Button), mais je n'ai pas trouvé la solution pour l'instant. Mettra à jour quand je fais.

Mise à jour:

J'était en mesure d'obtenir ce travail à l'aide validateNow(), et quelques minutes plus tard - je l'ai trouvé le lien suivant: http://forums.adobe.com/message/816912?tstart=0

Pour l'essentiel, le lien nous ordonne de mettre l'appel validateNow() l'intérieur d'un événement EnterFrame ou à l'intérieur d'un SetTimeout avec un bon timing.

- Je suppose que l'est le réelle Hauteur hauteur affichée de ComboBox - id est, si elle est ouverte, alors la hauteur avec la liste déroulante, sinon puis SANS. Cependant - les articles sont toujours là, mais avec jeu .visible false , qui élargit encore le récipient, même si vous ne voyez pas que ... Par conséquent - je dirais de le faire:

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

C'est la façon de le faire habituellement aussi bien ...

pouvez-vous configurer manuellement avant ce code:

container.width=100;

container.height=100;

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

Salut j'ai trouvé quelque part une solution pour un problème similaire avec NumericStepper.

et la solution est:

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

Dans votre cas, essayez ce qui suit:

var tInput:TextInput = combo.getChildAt(1) as TextInput;
tInput.textField.height = 22; 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top