2010-09-22 19 views
1

Je souhaite personnaliser l'aspect et la convivialité de la barre d'onglets d'un UITabBarController. Je veux changer les couleurs, la façon dont l'icône apparaît quand ils sont sélectionnés, et aussi, le plus important de tous, je veux réduire la taille de la barre d'outils personnalisée.Personnalisé UITabBarController

Mes approches pour cela et les obstacles dans ce sont:

A) La première solution qui est venue à l'esprit était de créer ma propre viewController qui agira comme un UITabBarController avec des boutons en bas et ajoutez cette viewController à la fenêtre. Une fois que l'utilisateur tape sur un bouton en bas, permutez la vue dans la zone visible avec le nouveau viewController qui correspond au bouton maintenant tapé par l'utilisateur.

Le problème avec cette stratégie est la suivante: puisque j'échange les viewControllers correspondants de vue ne sera pas obtenir ces messages:

  • viewWillAppear
  • viewWillDisappear
  • viewDidAppear
  • viewDidDisappear

Et tous les événements de rotation

B) Je aurais pu utiliser l'approche de la réponse acceptée dans ce fil: Custom UITabBarController Problems with View Controllers and Views

Mais la hauteur de mon tabBar n'est pas la même chose que la valeur par défaut.

En raison des raisons citées ci-dessus, je ne peux pas utiliser ces approches.

Cela dit, je n'ai pas d'exigence particulière d'onglet Plus. Je vais avoir seulement 5 onglets qui seront affichés par la barre d'onglets et donc la réorganisation des éléments de la barre d'onglets est hors de portée.

En attente de suggestions et d'idées.

Répondre

2

Je n'ai jamais essayé quelque chose comme ça mais comme je le vois, vous êtes censé envoyer ces messages à vos contrôleurs de vue enfant manuellement.

Il ne devrait pas y avoir de problème à envoyer -viewWill/Did (Dis) Apparaître au bon contrôleur au moment approprié. C'est ce que fait également UITabBarController.

En ce qui concerne les événements de rotation:

  • En shouldAutorotateToInterfaceOrientation:, transmettre ce message à vos contrôleurs enfant et définissez la valeur de votre retour en fonction de leurs valeurs de retour (UITabBarController renvoie uniquement YES si tous ses contrôleurs enfants reviennent YES pour la orientation demandée).

  • avant willRotateToInterfaceOrientation:duration:, didRotateFromInterfaceOrientation: et willAnimateRotationToInterfaceOrientation:duration: aux contrôleurs de l'enfant (au moins à celui qui est actuellement visible) lorsque vous les recevez.Si vous avez correctement défini les masques autoresizing des vues de vos contrôleurs enfants, vous les faites pivoter et redimensionnez correctement lorsque le système fait pivoter la vue du contrôleur de la barre d'onglets personnalisée. (Au moins, je pense que c'est comme ça que ça devrait fonctionner.)

Encore une fois, je ne suis pas sûr que cela fonctionnera.

+0

Hmmm, merci pour votre suggestion . Eh bien, je pourrais personnaliser comme vous l'avez dit. Aussi, je peux transmettre tous les messages comme vous l'avez mentionné. Mais les soucis sont: 1. -viewWillAppear et disAppear ne seront rien mais un ensemble consécutif d'appels! 2. Le contrôleur de vue reçoit automatiquement un rappel d'orientation initiale lorsque la vue est chargée. -didRotateFromInterfaceOrientation, mais dans ce cas nous devrons le simuler. 3. Je suis préoccupé par les problèmes ou les obstacles qui pourraient survenir à l'avenir, puisque c'est la base de mon application, je me demande si ce risque vaut la peine d'être pris? –

+0

Tous les contrôleurs de vue dans cette phrase signifient: "UITabBarController ne renvoie YES que si tous ses contrôleurs enfants retournent YES pour l'orientation demandée", disons s'il y a 4 onglets, alors si tous les viewcontrollers correspondant aux 4 onglets répondent seulement à l'orientation courante il devrait retourner YES -OU- seulement le contrôleur de vue qui est affiché par le TabBarcontroller devrait être interrogé? –

0

Vous pouvez mettre en œuvre le code suivant pour la création de la barre d'onglets personnalisés dans cette utilisation des images en utilisant le code make.further CGRect est utilisé pour la création de l'onglet personnalisé barre

-(void)applicationDidFinishLaunching:(UIApplication *)application { 

    // Add the tab bar controller's current view as a subview of the window 
    tabBarController.delegate = self; 
    tabBarController = [[UITabBarController alloc] init]; 

    mainDashBoard = [[DashBoard alloc] initWithNibName:@"DashBoard" bundle:nil]; 
    mainSearchView = [[SearchView alloc] initWithNibName:@"SearchView" bundle:nil]; 
    mainMoreView = [[MoreView alloc] initWithNibName:@"MoreView" bundle:nil]; 

    UINavigationController *nvCtr0 = [[[UINavigationController alloc] init] autorelease]; 
    UINavigationController *nvCtr1 = [[[UINavigationController alloc] initWithRootViewController:mainDashBoard] autorelease]; 
    UINavigationController *nvCtr2 = [[[UINavigationController alloc] initWithRootViewController:mainSearchView] autorelease]; 
    UINavigationController *nvCtr3 = [[[UINavigationController alloc] initWithRootViewController:mainMoreView] autorelease]; 
    UINavigationController *nvCtr4 = [[[UINavigationController alloc] init] autorelease];//[[[UINavigationController alloc] initWithRootViewController:nil] autorelease]; 

    tabBarController.viewControllers = [NSArray arrayWithObjects:nvCtr0,nvCtr1,nvCtr2,nvCtr3,nvCtr4,nil]; 

    nvCtr0.tabBarItem.enabled = NO; 
    nvCtr4.tabBarItem.enabled = NO; 

    [window tabBarController.view]; 
}