tabbar项目图像和selectedImage

ans*_*hul 1 iphone uitabbarcontroller uitabbaritem ios

我有一个标签栏控制器(它是一个基于标签栏的应用程序,因此标签栏位于MainWindow.xib上).在这个xib中,我添加了4个标签栏项目,并设置了所有标签栏项目的图像.因此,我面临两个问题:

1)图像是白色的,但是当我运行应用程序时,它显示标签栏项目上的所有图像为灰色.如何使其看起来与原始图像中的相同.

2)我有一个选定的图像,我想在当前选中的标签栏项目上添加.我该怎么办?

尼克代码后更新:

嘿,在iOS 5中,你必须在你的app委托中编写以下代码,用于设置选中和未选中的标签栏项目(类别解决方案仅适用于4):

if ([[[UIDevice currentDevice] systemVersion] floatValue]>4.9) {
    NSString *selectedImageName,*unselectedImageName;

    for (int counter = 0; counter < [self.tabBarController.tabBar.items count]; counter++) {
        if (counter==0) {
            selectedImageName = <someImagename>;
            unselectedImageName = <someImagename>;
        }
        else if (counter==1) {
            selectedImageName = <someImagename>;
            unselectedImageName = <someImagename>;
        }
        .
                    .
        else {
            selectedImageName = <someImagename>;
            unselectedImageName = <someImagename>;
        }
        UIImage *selectedImage = [UIImage imageNamed:selectedImageName];
        UIImage *unselectedImage = [UIImage imageNamed:unselectedImageName];

        UITabBarItem *item = [self.tabBarController.tabBar.items objectAtIndex:counter];
        if ([item respondsToSelector:@selector(setFinishedSelectedImage:withFinishedUnselectedImage:)]) {
            [item setFinishedSelectedImage:selectedImage withFinishedUnselectedImage:unselectedImage];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 6

将此类别添加到项目中.它将强制标签栏项目将原始图像用作禁用状态,而不是对它们应用灰色渐变:

@implementation UItabBarItem (CustomUnselectedImage)

- (UIImage *)unselectedImage
{
    return self.image;
}

@end
Run Code Online (Sandbox Code Playgroud)

这似乎是使用私有API,但我已经看到这在已批准的应用程序上多次使用.它实际上没有调用私有方法,只是覆盖了一个方法.

如果您需要为选定和未选择的图像指定不同的图像,最好的办法是使用UITabBarItem的tag属性和switch语句,如下所示:

@implementation UItabBarItem (Custom)

- (UIImage *)selectedImage
{
    switch (self.tag)
    {
        case 1:
            return [UIImage imageNamed:@"tab-selected1.png"];
        case 2:
            return [UIImage imageNamed:@"tab-selected2.png"];
        etc...
    }
}

- (UIImage *)unselectedImage
{
    switch (self.tag)
    {
        case 1:
            return [UIImage imageNamed:@"tab-unselected1.png"];
        case 2:
            return [UIImage imageNamed:@"tab-unselected2.png"];
        etc...
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

然后在界面构建器中,不要打扰设置标签栏项目图像,因为它们只是被忽略.而是将其标记设置为与您在switch语句中指定的图像相匹配.

请注意,如果应用程序中有多个选项卡栏,并且您不希望以这种方式覆盖它们,则可以在UITabBarItem的子类而不是类别上定义这些方法.然后,您可以将nib文件中的选项卡栏项设置为自定义子类而不是常规UITabBarItems,只有那些会受影响.

编辑:

请注意,从iOS 5开始,使用UIAppearance API有更好的方法.这种技术应该仍然有效,但谁知道Apple现在是否可以开始打击它,因为有一种官方支持的方法.除非你真的需要iOS 4支持,否则最好使用新方法.