2009-08-03 7 views
0

J'ai un objet UIImageView qui est simplement un rectangle noir. C'est ce que j'utilise pour sélectionner un bouton dans la vue.Réutilisation de la sous-vue

Le problème est, j'ai 49 de ces boutons dans ma vue, et chacun d'eux peut être sélectionné en même temps.

Ce que j'utilise pour ajouter un sous-vue à un bouton est:

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
[selectedSquareView setImage:[UIImage imageNamed:@"SelectedSquare.png"]]; 
[button addSubview: selectedSquareView]; 

je voudrais le selectedSquareView à être réutilisé plusieurs fois comme pour les sous-vues d'autres boutons, mais seulement garder une allocation de celui-ci. Je préférerais ne pas avoir 49 UIImageViews créés en même temps juste à cet effet. Est-ce possible?

Si ce n'est pas le cas, dois-je les stocker dans un NSMutableArray pour pouvoir les retirer plus tard?

Cordialement

-Raymond

Répondre

1

Vous aurez besoin de 49 UIImageViews, il vous suffit 1 UIImage. Les UIImageViews contiennent des informations sur la position, la taille, is_higlighted, etc. pour chaque bouton.

Cela étant dit, même si vous aviez beaucoup de UIImage de, UIImage est censé être assez intelligent sur ces choses qu'Apple décrit dans la documentation:

Dans les situations à faible mémoire, des données d'image peuvent être purgés à partir d'un objet UIImage pour libérer de la mémoire sur le système. Ce comportement de purge affecte uniquement les données d'image stockées en interne par l'objet UIImage et non l'objet lui-même. Lorsque vous essayez de dessiner une image dont les données ont été purgées, l'objet image recharge automatiquement les données de son fichier d'origine. Cependant, cette étape de charge supplémentaire peut entraîner une légère pénalité de performance.

Vous devez éviter de créer des objets UIImage dont la taille est supérieure à 1024 x 1024. Outre la grande quantité de mémoire qu'une telle image consommerait, vous pouvez rencontrer des problèmes lors de l'utilisation de l'image comme texture dans OpenGL ES ou lors du dessin de l'image sur une vue ou un calque. Cette restriction de taille ne s'applique pas si vous effectuez des manipulations basées sur le code, telles que le redimensionnement d'une image de taille supérieure à 1 024 x 1 024 pixels en l'attachant à un contexte graphique protégé par bitmap. En fait, vous devrez peut-être redimensionner une image de cette manière (ou la diviser en plusieurs petites images) afin de la dessiner sur l'une de vos vues.

Alternativement, si vous vous sentez vraiment que vous devez faire supprimer de la UIImageView lorsqu'ils ne sont pas en cours d'utilisation, vous pouvez faire ce que vous proposez de les stocker dans un tableau et les libérer sur viewDidDisappear puis les recréer tout sur viewWillAppear.

0

Chaque UIView n'apparaît qu'une seule fois, vous devrez donc en créer 49 exemplaires.

Votre code actuel est probablement très bien, car UIImage probablement en cache l'image, mais vous pouvez vous pour créer l'image une seule fois, puis réglez chaque fois, quelque chose comme:

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
static UIImage* kSelectedSquareImage = [UIImage imageNamed:@"SelectedSquare.png"] retain]; 
[selectedSquareView setImage:kSelectedSquareImage]; 

Si non , dois-je les stocker dans un NSMutableArray pour une suppression facile plus tard?

Cela dépend s'il y a d'autres vues dans la vue du conteneur - sinon, il n'y a pas besoin de les stocker dans un NSMutableArray que vous pouvez simplement utiliser container.subviews pour obtenir un tableau de vues. Sinon, bien sûr, vous pouvez les stocker dans un NSMutableArray et les supprimer de cette façon (assurez-vous de les supprimer du tableau ou de libérer le tableau, sinon ils resteront en mémoire simplement parce qu'ils sont stockés dans le tableau).

Questions connexes