• Billet écrit dans : Mobile, iPhone 08.03.2009

    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. 
     }
    Billet écrit dans : Mobile, iPhone 08.03.2009

    Tags: , , ,

  • Réagissez a cet article ?!

    Attention: Les commentaires sont modérés et ne sont pas visibles automatiquement. Ce n'est pas la peine de re-soumettre votre commentaire.

    Add a comment on FriendFeed




CV Guillaume chave