8
votes

Définir une image d'arrière-plan pour un tabbar

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> xxx pré>

rootviewcontroller.m p> xxx pré>

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];


1 commentaires

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 .


12 Réponses :


0
votes

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.


0 commentaires

3
votes

Vous aurez besoin de coder de manière conditionnelle cette version du système d'exploitation.

Si vous ne supportez que iOS 5, vous pouvez simplement utiliser la propriété BACKINIMAGE 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:

onglet personnalisé Barre d'arrière-plan - in iOS 4.x


0 commentaires

7
votes
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];

2 commentaires

@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.



0
votes

Ce que j'ai fait dans le passé est de créer mon propre tabbarcontroller pour charger différents uiviewcontrols . 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 , puisque vous n'utilisez pas réellement l'uitabbar de natabbar


0 commentaires

14
votes

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> xxx PRE>

// 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


3 commentaires

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; Cette ligne doit être modifiée en auto.electedindex = tabide - 101;



0
votes
 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];
}

0 commentaires

0
votes
// 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
}

0 commentaires

1
votes

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


0 commentaires

1
votes

Il vous suffit d'identifier chaque cas, en vérifiant la version avec -RePPrespectoSelector 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: xxx

et le fichier .m: xxx

-Drawlayer: incontext dessinera l'image d'arrière-plan rapide.


0 commentaires

1
votes

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] , donc j'ai pensé à dessiner l'image dans -Drawlayer: Couche Incontext: CTX (le -DrawinRect: rect n'est pas appelé). Toutefois, si vous pouvez éviter d'appeler [onglet SetNeedsDisplay] , il existe un moyen simple de faire cela: xxx


0 commentaires

0
votes
// Change the tab bar background
 UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
 [[UITabBar appearance] setBackgroundImage:tabBarBackground];

0 commentaires