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

1)图像是白色的,但是当我运行该应用程序时,它在选项卡栏项上将所有图像显示为灰色。如何使它看起来与原始图像相同。

2)我有一个选定的图像,要添加到当前选定的选项卡栏项上。我应该怎么做?

在NICK的代码后更新:

嘿,在iOS 5中,您将必须在应用程序委托中编写以下代码来设置选项卡栏项的选定和未选定图像(类别解决方案仅适用于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];
        }
    }
}

最佳答案

将此类别添加到您的项目。它将强制选项卡栏项目将原始图像用作禁用状态,而不是对其应用灰色渐变:

@implementation UItabBarItem (CustomUnselectedImage)

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

@end

看起来好像正在使用 private API,但是我已经在批准的应用程序上多次使用它。它实际上不是在调用 private 方法,而是重写一个 private 方法。

如果您需要为选定和未选定的图像指定不同的图像,则最好的选择是使用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

然后,在界面生成器中,不必理会设置标签栏项图像,因为它们只会被忽略。而是将其标签设置为与您在switch语句中指定的图像匹配。

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

编辑:

请注意,从iOS 5开始,有一种使用UIAppearance API的更好方法。这项技术应该仍然有效,但是谁知道苹果现在是否可以开始对这种技术进行严厉打击,因为有了一种官方支持的方法。除非您确实需要iOS 4支持,否则最好使用新方法。

关于iphone - 标签栏项目图片和selectedImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8939399/

10-10 14:22