【问题标题】:Setting a background image for a tabbar为标签栏设置背景图像
【发布时间】:2012-02-13 03:04:01
【问题描述】:

我正在尝试以编程方式为我的应用程序中的标签栏设置背景图像。我的代码如下:

RootViewController.h

IBOutlet UITabBar *mainTabBar;
    IBOutlet UITabBarItem *settingsBarItem;
    IBOutlet UITabBarItem *infoBarItem;
    IBOutlet UITabBarItem *aboutBarItem;

RootViewController.m

-(void)viewDidLoad {

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"smallMenuBackground.png"]];    
    [mainTabBar insertSubview:imageView atIndex:0];
    [imageView release];

    [super viewDidLoad];
}

这对我不起作用。

更新

2012 年 1 月 23 日更新

好的,我已经取得了一些进展。自从我升级到 Xcode 4.2 和 IOS5 后,这才停止工作。我设法使用 Interface Builder 中的选项将其取回,但现在它仅适用于 IOS5。理想情况下,我希望以编程方式开始工作,但我现在会满足于 IB 解决方案。

我似乎无法让它适用于任何以前的版本。

注意:我的 TabBar 仅在我的 RootViewController 上,这是我的应用程序的主屏幕。

理想情况下,如果我能让 Nithin 建议的代码正常工作,那就太好了:

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

任何帮助将不胜感激。

问候, 斯蒂芬

【问题讨论】:

  • 查看此链接。这里虽然要求提供背景颜色,但有代码将图像作为背景放在一篇文章中。 Check it.

标签: iphone tabbar


【解决方案1】:

您可以为 UITabBarController 使用自定义类并覆盖您的 tabBarController。在那里,您可以使用图像设置所需的按钮及其操作。

这是您的自定义标签栏控制器类的外观:

// CustomTabBarController.h

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {
    UIButton *settingsButton;
    UIButton *infoButton;
    UIButton *aboutUsButton;
}

@property (nonatomic, retain) UIButton *settingsButton;
@property (nonatomic, retain) UIButton *infoButton;
@property (nonatomic, retain) UIButton *aboutUsButton;

-(void) addCustomElements;
-(void) selectTab:(int)tabID;

@end

// CustomTabBarController.m

#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

希望这对你有很大帮助。

【讨论】:

  • 谢谢二凡,我只想要RootViewController中的tabbar,如何调用自定义类?
  • 在这种情况下,你可以调用上面提到的自定义类.....只是有点不同,在你的故事板/主窗口中添加一个 UIViewController。在您的应用程序委托类中,在 applicationDidFinishLaunching 内部将 viewController 添加为窗口中的子视图。然后您的 RootViewController 将出现在您的 viewController 内的屏幕中。然后,您可以根据需要在 viewController 顶部隐藏或取消隐藏标签栏控制器。这只是一个建议。你可以试试这个。我希望它会完成。 :)
  • self.selectedIndex = tabID; 这行要改成self.selectedIndex = tabID - 101;
【解决方案2】:
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/uitabbar查看此链接给出的方法
  • 再次感谢 Nithin,我已经尝试了链接中的示例,但无法正常工作。
【解决方案3】:

您需要按操作系统版本有条件地对此进行编码。

如果您只支持 iOS 5,您可以简单地使用标签栏的 backgroundImage 属性。如果您需要支持低于 5 的 iOS 版本,您应该添加一些条件代码来“破解”它。有几种方法可以做到这一点,这里是一种:

Custom tab bar background image - in iOS 4.x

【讨论】:

    【解决方案4】:

    取自:http://ios-blog.co.uk/tutorials/ios-custom-ui-series-tabbar-navbar/

    // Change the tab bar background
    UIImage *tabBarBackground = [UIImage imageNamed:@"CustomUITabbar.png"];
    [[UITabBar appearance] setBackgroundImage:tabBarBackground];
    [[UITabBar appearance] setTintColor:[UIColor whiteColor]];
    

    【讨论】:

      【解决方案5】:

      就像之前在 iOS 5 上提到的,我建议你使用背景图片:

      UITabBar *tabBar = tabController.tabBar;
      if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) {
          tabBar.backgroundImage = [UIImage imageNamed:@"TabBackground.png"];
      }
      

      始终使用respondsToSelector 之类的检查,而不是显式的版本检查。这会产生更安全、更面向未来的代码。

      在 iOS 4 上,我建议您使用 -[UITabBar drawRect:] 方法,最好在子类中使用。然后在 Interface Builder 中将 UITabBarControllers UITabBar 自定义类(通常在 MainWindow.xib 中)设置为您的自定义子类。

      但是,如果您不使用 MainWindow.xib,并且像您在代码中生成 UITabBarController 的 iOS 5 代码模板一样,您只能使用 UITabBar 上的类别覆盖 drawRect: 方法。

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

      这仅适用于 iOS 4.x 及更早版本的系统,但没关系,因为我们已经涵盖了 iOS 5。

      【讨论】:

        【解决方案6】:

        您只需要识别每个案例,使用 -respondToSelector 检查版本,正如 Vinodh 所说。我建议您在 UITabBar 上创建一个类别并轻松完成。所以代码会有这样的形式:

            // UITabBar+Custom.h
        
            #import <UIKit/UIKit.h>
            #import <QuartzCore/QuartzCore.h>
        
            @interface UITabBar (Custom)
            -(void)setTabBarBackground:(UIImage *)backgroundImage;
            @end
        

        还有.m文件:

            // UITabBar+Custom.m
        
            #import "UITabBar+Custom.h"
            #import <objc/runtime.h>
        
            static char *backgroundImageKey;
        
            -(void)setImage:(UIImage *)anImage  {
                  objc_setAssociatedObject(self, &backgroundImageKey, 
                        anImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
                  [self setNeedsDisplay];
            }
        
            -(UIImage *)image  {
                  return objc_getAssociatedObject(self, &backgroundImageKey);
            }
        
            -(void)setTabBarBackground:(UIImage *)backgroundImage  {
                 if([self respondsToSelector:@selector(setBackgroundImage:)]) {
                      [self setBackgroundImage:backgroundImage];
                 }  else  {
                      [self setImage:backgroundImage];
                 }
            }
        
            -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx  {
                UIGraphicsPushContext(ctx);
                UIImage *currentImage = [self image];
                CGContextTranslateCTM(ctx, 0, currentImage.size.height);
                CGContextScaleCTM(ctx, 1.0, -1.0);
        
                CGContextDrawImage(ctx, self.bounds, currentImage.CGImage);
                UIGraphicsPopContext();
            }
        

        -drawLayer:inContext 将快速绘制背景图像。

        【讨论】:

          【解决方案7】:

          正如我上面回答的那样,不添加 UIView 可以将背景图像添加到 UITabBar,当您调用 [tabBar setNeedsDisplay] 时该图像可能会消失,所以我想在 -drawLayer:layer inContext:ctx 中绘制图像(-drawInRect:rect没有被调用)。但是,如果您可以避免调用[tabBar setNeedsDisplay],有一个简单的方法可以做到这一点:

          // UITabBar+Custom.m
          
          #import "UITabBar+Custom.h"
          #import <QuartzCore/QuartzCore.h>
          
          -(void)setTabBarBackground:(UIImage *)backgroundImage  {
               if([self respondsToSelector:@selector(setBackgroundImage:)]) {
                    // ios 5+
                    [self setBackgroundImage:backgroundImage];
               }  else  {
                    // ios 3.x / 4.x
                    self.layer.contents = (id)backgroundImage.CGImage;
               }
          }
          

          【讨论】:

            【解决方案8】:

            获取自定义视图并将其添加到 UITaB 栏。现在在该视图上添加按钮并提供指向选项卡栏按钮的方法链接。现在你可以通过添加图像或任何东西在那个视图上做任何事情。它就像自定义标签栏一样工作。

            【讨论】:

              【解决方案9】:

              我过去所做的是创建自己的 TabbarController 来加载不同的UIViewControllers。使用此控制器,我可以操纵其中的选项卡栏和选项卡栏项目的外观。

              这对我来说很好,但最初需要一些工作。因为您必须“模拟”UITabBarController,因为您实际上并没有使用“本机”UITabBar

              【讨论】:

                【解决方案10】:
                 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];
                }
                

                【讨论】:

                  【解决方案11】:
                  // 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
                  }
                  

                  【讨论】:

                    【解决方案12】:
                    // Change the tab bar background
                     UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
                     [[UITabBar appearance] setBackgroundImage:tabBarBackground];
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-04-08
                      • 2017-04-12
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多