22

当用户选择标签栏项目时,我想要与未选择时不同的背景颜色。

4

11 回答 11

23

把这个放在Appdelegate.m里面application didFinishLaunchingWithOptions

UIImage *whiteBackground = [UIImage imageNamed:@"whiteBackground"];
[[UITabBar appearance] setSelectionIndicatorImage:whiteBackground];
于 2013-08-02T08:12:24.863 回答
12

如果您使用情节提要或 xibs,请单击“选项卡栏”并将“selectedImageTintColor”路径添加到 Key Path Attributes 标记中。像这样 :

在此处输入图像描述

于 2014-01-16T19:10:14.503 回答
7

更新:从 iOS 7.1 开始,此技术不再有效(如果用户连续两次点击同一选项卡,则背景颜色被清除)。


UITabBarItem是的子类UIBarItem,一切都更痛苦,因为 UIBarItem 没有子类UIView;但是,UITabBarItem 包含一个。下面的内容会操纵该视图,因此如果提交到 AppStore 可能会被拒绝。

1) 子类 UITabBarItem

创建 UITabBarItem 的子类并selected在其标题中添加一个新属性,如下所示:

@interface ALDTabBarItem : UITabBarItem
@property (nonatomic, assign, getter = isSelected) BOOL selected;
@end

UITabBarItems 有一个视图属性,但它没有公开。我们可以扩展类来访问它,然后在selected属性上创建一个自定义设置器来更改背景颜色,如下所示:

#import "ALDTabBarItem.h"

@interface ALDTabBarItem (ALD)
@property (nonatomic, strong) UIView *view;
@end

@implementation ALDTabBarItem

- (void)setSelected:(BOOL)selected
{
    if(selected)
        self.view.backgroundColor = [UIColor redColor];
    else
        self.view.backgroundColor = [UIColor clearColor];
} 

@end

2) 更新您的 UITabBarController 委托

将以下代码添加到您的 UITabBarController 的委托中,该委托设置 UITabBar 的选定状态:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    for(ALDTabBarItem *myItem in tabBar.items)
        myItem.selected = (myItem == item);
}
于 2013-11-15T23:15:10.297 回答
7

在斯威夫特

UITabBar.appearance().selectionIndicatorImage = UIImage(named: "tabSelected")

带有tabSelected@2x.png尺寸为 98x98 像素的图像

于 2015-12-07T09:17:06.290 回答
6

请按照以下步骤操作:

  1. 创建子类UITabBarController

  2. 转到viewDidAppearUITabBarController

  3. 现在找到 TabBarItem 的大小,

    UITabBar *tabBar = self.tabBar;
    CGSize imgSize = CGSizeMake(tabBar.frame.size.width/tabBar.items.count,tabBar.frame.size.height);
    
  4. 现在创建具有该大小的图像,

    //Create Image
    UIGraphicsBeginImageContextWithOptions(imgSize, NO, 0);
    UIBezierPath* p =
    [UIBezierPath bezierPathWithRect:CGRectMake(0,0,imgSize.width,imgSize.height)];
    [[UIColor blueColor] setFill];
    [p fill];
    UIImage* finalImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
  5. 现在,将此图像分配给 TabBar 的SelectionIndicatorImage

    [tabBar setSelectionIndicatorImage:finalImg];
    

斯威夫特 4 版本:

let imgSize = CGSize(width: tabBar.frame.size.width / CGFloat(tabBar.items!.count),
                     height: tabBar.frame.size.height)
UIGraphicsBeginImageContextWithOptions(imgSize, false, 0)
let p = UIBezierPath(rect: CGRect(x: 0, y: 0, width: imgSize.width,
                                  height: imgSize.height))
UIColor.blue.setFill()
p.fill()
let finalImg = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UITabBar.appearance().selectionIndicatorImage = finalImg
于 2017-05-19T10:03:55.417 回答
5

我的回答类似于@Mehul Thakkar,但它在Swift 4中,为了改进他的回答,我想说,如果你viewDidAppear按照他的建议放入代码,用户会看到发生的变化,这不是好的用户体验。

因此,为您的标签栏控制器创建自定义类并viewDidLoad 放置以下代码:

let singleTabWidth: CGFloat = self.tabBar.frame.size.width / CGFloat((self.tabBar.items?.count)!)
let singleTabSize = CGSize(width:singleTabWidth , height: self.tabBar.frame.size.height)

let selectedTabBackgroundImage: UIImage = self.imageWithColor(color: .white, size: singleTabSize)
self.tabBar.selectionIndicatorImage = selectedTabBackgroundImage

imageWithColor功能如下:

//image with color and size
    func imageWithColor(color: UIColor, size: CGSize) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context!.setFillColor(color.cgColor)
        context!.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }

希望这可以帮助某人。

于 2017-11-16T17:21:33.517 回答
1

请参考以下网址。

更改 UITabBar 的色调/背景颜色

如何在 Xcode 中更改标签栏颜色

希望对你有帮助..

试试这个来改变标签栏项目的颜色,但它只适用于 ios5。

if ([UITabBar instancesRespondToSelector:@selector(setSelectedImageTintColor:)])
{
    [tabBarController.tabBar setSelectedImageTintColor:[UIColor redColor]];
}
于 2013-07-29T05:59:40.267 回答
0

您可以使用 tintcolor。

[[UITabBar appearance] setSelectedImageTintColor:[UIColor redColor]];

在 AppDelegate.m 中,将以下代码放在 // 应用程序启动后自定义覆盖点之后。

于 2013-07-26T10:33:19.120 回答
0

把它放在你的 AppDelegate.m 文件中:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            // Override point for customization after application launch.

            [UITabBar appearance].selectionIndicatorImage = [UIImage imageNamed:@"activeTabBackgroundImage"];


            return YES;
        }
于 2015-10-11T11:46:47.243 回答
0

目前在 Xcode 8.3.2 中,您可以在情节提要中使用代表实际背景的图像来执行此操作。

选择标签栏控制器内的标签栏:

在此处输入图像描述

在 Utilities 中选择 Attributes Inspector 并更改选择背景图像:

在此处输入图像描述

于 2017-06-06T15:38:52.187 回答
0

迅速回答4:

在 iOS 8 上不推荐使用 setSelectedImageTintColor。

而是使用这个:

self.tabBar.tintColor = UIColor.white

于 2018-03-06T13:35:06.593 回答