Connaissez vous l’attribut « tag » d’une UIView ?
Cette propriété sert à différencier les vues les unes des autres. Il s’agit d’un entier qui, par défaut, est géré par l’iphone. Mais on peut la fixer à la main et cela permet quelque liberté. En voici une utilisation :
Admettons que vous avez une vue centrale qui sert de menu en « footer » et que vous n’utilisez pas les composants de navigations par défaut du téléphone.
Lors d’un clic sur un bouton du menu « footer », vous allez ajouter une nouvelle vue par dessus votre écran principal en laissant le footer de la vue principal visible. Seulement voilà, à chaque clic sur un bouton du menu, vous allez superposer une vue à chaque fois. Question performance c’est pas tip top.
Alors une première approche est déjà de faire un bouton retour dans la nouvelle vue comme ceci :
1 2 3 4 5 | - (IBAction)back { NSLog(@"back"); [self.view removeFromSuperview]; } |
Mais bon rien n’empêche l’utilisateur de clicker sur les éléments du footer au lieu de faire retour. Notez que même si cette nouvelle vue est ajouté par dessus la principale et la masque complètement, les autres boutons de la vue principale sont encore actifs. Sauf si on les désactive lors du click sur le bouton et qu’on les réactives lors de l’action « back » précédemment crée, via une méthode delegate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // Dans la vue qui se superpose - (IBAction)back { NSLog(@"back"); [self.delegate RetourMenu]; [self.view removeFromSuperview]; } // Dans la vue principale -(void)RetourMenu { NSLog(@"Réactivation des boutons "cachés" par la nouvelle superposés"); btnVue1.enabled = YES; btnVue2.enabled = YES; btnVue3.enabled = YES; } |
Il faut maintenant gérer les vues afin d’éviter les superposements inutiles. Ceci se fait via la propriété tag. Personnellement j’ai définit le tag de ma vue principal à 100 via Interface Builder. Mais je pense qu’un self.tag = 100 dans le viewDidLoad marche aussi.
Puis voici comment je change de vue :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | - (IBAction)ClickMenu{ // Vide l'écran de toutes vues, sauf celle de l'écran principale NSArray *subviews = [[self.view superview] subviews]; UIView *view; for (view in subviews) { // Le tag 100 correspond à la vue "Menu Principale" if(view.tag != 100) { [view removeFromSuperview]; } } // Définit la vue courante et le gestionnaire d'évènement de MaVueSuivante MaVueSuivante*myView = [[MaVueSuivantealloc] initWithNibName:@"MaVueSuivanteNib" bundle:[NSBundle mainBundle]]; myView.delegate = self; // Recupère le singleton de l'application courante MonProjetAppDelegate *app = (Lacoste_0_MonProjetAppDelegate *)[[UIApplication sharedApplication] delegate]; [app.window addSubview:myView.view]; // Désactivation des boutons "cachés" par la nouvelle vue btnVue1.enabled = NO; btnVue2.enabled = NO; btnVue3.enabled = NO; } |
Simple non ?
Enfin pour rendre une vue par dessus une autre tout en gardant la vue principal visible j’utilise la propriété « bounds » de la vue à afficher comme ceci :
1 2 3 4 | - (void)viewDidLoad { view.bounds = CGRectMake(0, 0, 320, 450); // Une hauteur de -30 pixels par rapport à la normal. } |






