tabbar项目图像和selectedImage

时间:2012-01-20 09:44:38

标签: iphone ios uitabbarcontroller uitabbaritem

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

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

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

NICK的代码后更新:

嘿,在iOS 5中,您必须在app delegate中编写以下代码,用于设置选中和未选中的标签栏项目(类别解决方案仅适用于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];
        }
    }
}

2 个答案:

答案 0 :(得分:6)

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

@implementation UItabBarItem (CustomUnselectedImage)

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

@end

这可能看起来像是在使用私有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

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

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

编辑:

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

答案 1 :(得分:1)

基于http://blog.theanalogguy.be/对我有用。添加类别UItabBarItem(CustomUnselectedImage) - 没有效果=(

* .h

@interface CustomTabBarItem : UITabBarItem {  
    UIImage *customHighlightedImage;  
    UIImage *customNormalImage;  
}  

@property (nonatomic, retain) UIImage *customHighlightedImage;  
@property (nonatomic, retain) UIImage *customNormalImage;  

- (id)initWithTitle:(NSString *)title 
        normalImage:(UIImage *)normalImage 
    highlightedImage:(UIImage *)highlightedImage 
                tag:(NSInteger)tag;
@end

和* .m

#import "CustomTabBarItem.h"

@implementation CustomTabBarItem  

@synthesize customHighlightedImage;  
@synthesize customNormalImage;  

- (id)initWithTitle:(NSString *)title 
        normalImage:(UIImage *)normalImage 
    highlightedImage:(UIImage *)highlightedImage 
                tag:(NSInteger)tag{

    [self initWithTitle:title
                    image:nil
                    tag:tag];
    [self setCustomNormalImage:normalImage];
    [self setCustomHighlightedImage:highlightedImage];
    return self;
}

- (void) dealloc  
{  
    [customHighlightedImage release];
    customHighlightedImage=nil;  
    [customNormalImage release]; 
    customNormalImage=nil;  
    [super dealloc];  
}  

-(UIImage *) selectedImage  
{  
    return self.customHighlightedImage;  
}  

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

@end  

快乐编码=] -