J'essaie de définir par programme l'image d'arrière-plan pour un onglet dans mon application. Mon code est comme suit:
racineviewcontroller.h p> rootviewcontroller.m p> ceci ne fonctionne pas pour moi. P> mise à jour em> p> Mise à jour 23 janvier 2012 P> OK, j'ai passé un peu de progrès. Cela n'a cessé que de travailler depuis que je suis mis à niveau vers Xcode 4.2 et iOS5. J'ai réussi à le récupérer en utilisant les options du constructeur d'interface, mais cela ne fonctionne maintenant que pour iOS5. Idéalement, j'aurais aimé pouvoir travailler de manière programmatique mais je me contenterai de la solution IB pour l'instant. P> Je n'arrive tout simplement pas à le faire fonctionner pour des versions antérieures. P> Remarque: ma barre d'onglets est uniquement sur mon racineViewController, qui est l'écran principal de mon application. P> Idéalement, si je pouvais obtenir le code de la nithine suggérée, ce serait génial: P> UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tabBG.png"]];
if ([[[UIDevice currentDevice] systemVersion] floatValue] > 4.9) {
//iOS 5
[self.tabBarController.tabBar insertSubview:imageView atIndex:1];
}
else {
//iOS 4.whatever and below
[self.tabBarController.tabBar insertSubview:imageView atIndex:0];
}
[imageView release];
12 Réponses :
Prenez une vue personnalisée et ajoutez-la sur UITAB BAR. Maintenant, ajoutez un bouton de la vue et de la méthode fournie sur les boutons de barre d'onglets. Maintenant, vous pouvez faire ce que vous pouvez faire quoi que ce soit sur cette vue en ajoutant une image ou une chose. Cela fonctionne comme une barre d'onglets personnalisée. P>
Vous aurez besoin de coder de manière conditionnelle cette version du système d'exploitation. p>
Si vous ne supportez que iOS 5, vous pouvez simplement utiliser la propriété CODE> BACKINIMAGE CODE> de la barre d'onglets. Si vous devez prendre en charge des versions d'iOS ci-dessous, vous devez ajouter un code conditionnel qui «ticks» en place. Il y a plusieurs approches pour faire cela, voici un: p>
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tabBG.png"]]; if ([[[UIDevice currentDevice] systemVersion] floatValue] > 4.9) { //iOS 5 [self.tabBarController.tabBar insertSubview:imageView atIndex:1]; } else { //iOS 4.whatever and below [self.tabBarController.tabBar insertSubview:imageView atIndex:0]; } [imageView release];
@Stephen Tumblr.com/tagged/itabbar Vérifiez la méthode donnée dans ce lien
Merci encore Nithin, j'ai essayé les exemples dans le lien mais je ne pouvais pas le faire fonctionner.
Ce que j'ai fait dans le passé est de créer mon propre tabbarcontroller pour charger différents uiviewcontrols code>. Avec ce contrôleur, je peux manipuler l'apparence des éléments de tabbar et de tabbar.
Cela fonctionne bien par moi, mais c'est initialement un peu de travail. Parce que vous devez "simuler" le uitabbarcontroller code>, puisque vous n'utilisez pas réellement l'uitabbar de natabbar p>
Vous pouvez utiliser une classe personnalisée pour UitabbarController et remplacer votre tabbarController. Là, vous pouvez définir vos boutons requis et leurs actions avec une image.
C'est ainsi que votre classe de contrôleur de barre d'onglets personnalisée peut être ressemblant à: p>
// personnalisétabbarcontroller.h p> // CUSTOMTABBARCONTROLLER.M P> #import "CustomTabBarController.h"
@implementation CustomTabBarController
@synthesize settingsButton, infoButton, aboutUsButton;
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
-(void)viewDidLoad
{
[super viewDidLoad];
[self addCustomElements];
}
-(void)addCustomElements
{
// Background
UIImageView* bgView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tabBarBackground.png"]] autorelease];
bgView.frame = CGRectMake(0, 420, 320, 60);
[self.view addSubview:bgView];
// Initialise our two images
UIImage *btnImage = [UIImage imageNamed:@"settings.png"];
UIImage *btnImageSelected = [UIImage imageNamed:@"settingsSelected.png"];
self.settingsButton = [UIButton buttonWithType:UIButtonTypeCustom]; //Setup the button
settingsButton.frame = CGRectMake(10, 426, 100, 54); // Set the frame (size and position) of the button)
[settingsButton setBackgroundImage:btnImage forState:UIControlStateNormal]; // Set the image for the normal state of the button
[settingsButton setBackgroundImage:btnImageSelected forState:UIControlStateHighlighted]; // Set the image for the selected state of the button
[settingsButton setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; // Set the image for the selected state of the button
[settingsButton setBackgroundImage:btnImageSelected forState:UIControlStateDisabled];
[settingsButton setImage:btnImageSelected forState:(UIControlStateHighlighted|UIControlStateSelected)];
[settingsButton setTag:101]; // Assign the button a "tag" so when our "click" event is called we know which button was pressed.
[settingsButton setSelected:true]; // Set this button as selected (we will select the others to false as we only want Tab 1 to be selected initially
// Now we repeat the process for the other buttons
btnImage = [UIImage imageNamed:@"info.png"];
btnImageSelected = [UIImage imageNamed:@"infoSelected.png"];
self.infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
infoButton.frame = CGRectMake(110, 426, 100, 54);
[infoButton setBackgroundImage:btnImage forState:UIControlStateNormal];
[infoButton setBackgroundImage:btnImageSelected forState:UIControlStateSelected];
[infoButton setBackgroundImage:btnImageSelected forState:UIControlStateHighlighted];
[infoButton setImage:btnImageSelected forState:(UIControlStateHighlighted|UIControlStateSelected)];
[infoButton setTag:102];
btnImage = [UIImage imageNamed:@"aboutUs.png"];
btnImageSelected = [UIImage imageNamed:@"aboutUsSelected.png"];
self.aboutUsButton = [UIButton buttonWithType:UIButtonTypeCustom];
aboutUsButton.frame = CGRectMake(210, 426, 100, 54);
[aboutUsButton setBackgroundImage:btnImage forState:UIControlStateNormal];
[aboutUsButton setBackgroundImage:btnImageSelected forState:UIControlStateSelected];
[aboutUsButton setBackgroundImage:btnImageSelected forState:UIControlStateHighlighted];
[aboutUsButton setImage:btnImageSelected forState:(UIControlStateHighlighted|UIControlStateSelected)];
[aboutUsButton setTag:103];
// Add my new buttons to the view
[self.view addSubview:settingsButton];
[self.view addSubview:infoButton];
[self.view addSubview:aboutUsButton];
// Setup event handlers so that the buttonClicked method will respond to the touch up inside event.
[settingsButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[infoButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[aboutUsButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonClicked:(id)sender
{
int tagNum = [sender tag];
[self selectTab:tagNum];
}
- (void)selectTab:(int)tabID
{
switch(tabID)
{
case 101:
[settingsButton setSelected:true];
[infoButton setSelected:false];
[aboutUsButton setSelected:false];
break;
case 102:
[settingsButton setSelected:false];
[infoButton setSelected:true];
[aboutUsButton setSelected:false];
break;
case 103:
[settingsButton setSelected:false];
[infoButton setSelected:false];
[aboutUsButton setSelected:true];
break;
}
self.selectedIndex = tabID;
}
- (void)dealloc {
[settingsButton release];
[infoButton release];
[aboutUsButton release];
[super dealloc];
}
@end
Merci Erfan, je veux que la barre d'onglets dans mon RootViewController, comment dois-je appeler la classe personnalisée?
Dans ce cas, vous pouvez appeler la classe personnalisée comme mentionné ci-dessus ..... juste un peu différent, ajoutez un UIViewController dans votre storyboard / la fenêtre principale. Dans votre classe de déléguée de l'application, ApplicationDidfinishLaunching ajoutez la visionneuse en tant que sous-visez dans votre fenêtre. Ensuite, votre rootviewController apparaîtra à l'écran qui se trouve à l'intérieur de votre mode de vue. Ensuite, vous pouvez masquer ou infliger votre contrôleur de tabbar si nécessaire au top de votre mode de vueController. Ce n'est qu'une suggestion. Vous pouvez essayer cela. J'espère que ça va être fait. :)
self.electedindex = tabide; code> Cette ligne doit être modifiée en
auto.electedindex = tabide - 101; Code>
jUst call these two methods hideTabBar; addCustomElements; hideTabBar method hides the original tabbar And addCustomElements method will add the custom tabbar image as well as custom tabbar button also - (void)hideTabBar { for(UIView *view in self.tabBarController.view.subviews) { // if([view isKindOfClass:[UITabBar class]]) // { // view.hidden = YES; // break; // } if([view isKindOfClass:[UITabBar class]]) { [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; } else { [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; } } } -(void)addCustomElements { // Initialise our two images UIImage *btnImage = [UIImage imageNamed:@"homet.png"]; UIImage *btnImageSelected = [UIImage imageNamed:@"homehovert.png"]; self.btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; //Setup the button btn1.frame = CGRectMake(28, 446, 25,28); // Set the frame (size and position) of the button) [btn1 setBackgroundImage:btnImage forState:UIControlStateNormal]; // Set the image for the normal state of the button [btn1 setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; // Set the image for the selected state of the button [btn1 setTag:0]; // Assign the button a "tag" so when our "click" event is called we know which button was pressed. [btn1 setSelected:true]; // Set this button as selected (we will select the others to false as we only want Tab 1 to be selected initially // Now we repeat the process for the other buttons btnImage = [UIImage imageNamed:@"blogt.png"]; btnImageSelected = [UIImage imageNamed:@"bloghovert.png"]; self.btn2 = [UIButton buttonWithType:UIButtonTypeCustom]; btn2.frame = CGRectMake(107, 448, 22,28); [btn2 setBackgroundImage:btnImage forState:UIControlStateNormal]; [btn2 setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; [btn2 setTag:1]; btnImage = [UIImage imageNamed:@"networkt.png"]; btnImageSelected = [UIImage imageNamed:@"networkhovert.png"]; self.btn3 = [UIButton buttonWithType:UIButtonTypeCustom]; btn3.frame = CGRectMake(180, 446, 35,29); [btn3 setBackgroundImage:btnImage forState:UIControlStateNormal]; [btn3 setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; [btn3 setTag:2]; btnImage = [UIImage imageNamed:@"contactt.png"]; btnImageSelected = [UIImage imageNamed:@"contacthovert.png"]; self.btn4 = [UIButton buttonWithType:UIButtonTypeCustom]; btn4.frame = CGRectMake(262, 447, 32,28); [btn4 setBackgroundImage:btnImage forState:UIControlStateNormal]; [btn4 setBackgroundImage:btnImageSelected forState:UIControlStateSelected]; [btn4 setTag:3]; self.img1 = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tabbar.png"]] ; img1.frame = CGRectMake(0, 440, 320, 40); [self.tabBarController.view addSubview:img1]; // Add my new buttons to the view [self.tabBarController.view addSubview:btn1]; [self.tabBarController.view addSubview:btn2]; [self.tabBarController.view addSubview:btn3]; [self.tabBarController.view addSubview:btn4]; // Setup event handlers so that the buttonClicked method will respond to the touch up inside event. [btn1 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; [btn2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; [btn3 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; [btn4 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; }
// not supported on iOS4 UITabBar *tabBar = [tabController tabBar]; if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) { // set it just for this instance [tabBar setBackgroundImage:[UIImage imageNamed:@"tabbar_brn.jpg"]]; // set for all // [[UITabBar appearance] setBackgroundImage: ... } else { // ios 4 code here }
Comme mentionné précédemment sur iOS 5, je vous suggère d'utiliser l'image d'arrière-plan:
// UITabBar+CustomBackground.h @interface UITabBar (CustomBackground) @end // UITabBar+CustomBackground.m @implementation UITabBar (CustomBackground) - (void) drawRect:(CGRect)frame { [[UIColor redColor] set]; CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextFillRect(ctx, [self bounds]); } @end
Il vous suffit d'identifier chaque cas, en vérifiant la version avec et le fichier .m: p> -RePPrespectoSelector code> comme indiqué à Vinodh. Je vous suggère de créer une catégorie sur Uitabbar et de le faire facilement. Donc, le code disposera de ce formulaire:
-Drawlayer: incontext code> dessinera l'image d'arrière-plan rapide. p> p>
Comme je répondis ci-dessus, sans ajouter uIView Il est possible d'ajouter l'image d'arrière-plan à un uitabbar, une image qui pourrait disparaître lorsque vous appelez [onglet SetNeedsDisplay] code>, donc j'ai pensé à dessiner l'image dans
-Drawlayer: Couche Incontext: CTX CODE> (le
-DrawinRect: rect code> n'est pas appelé). Toutefois, si vous pouvez éviter d'appeler
[onglet SetNeedsDisplay] code>, il existe un moyen simple de faire cela:
// Change the tab bar background UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"]; [[UITabBar appearance] setBackgroundImage:tabBarBackground];
tiré de: http: // iOS- blog.co.uk/tatudials/ios-custom-ui-series-tabbar-navbar/
Vérifiez ce lien. Mais ici il est demandé la couleur d'arrière-plan, mais il y a un code pour mettre l'image en arrière plan dans un poste. Check it .